首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在oracle中对不同的模式运行检查数据库?

如何在oracle中对不同的模式运行检查数据库?
EN

Stack Overflow用户
提问于 2012-08-07 01:10:59
回答 5查看 6.5K关注 0票数 5

我想对一个Oracle数据库运行inspectdb。我使用的用户帐户是拥有0个表的只读用户。但是,它可以访问包含所有表的架构。如何在使用inspectdb时指定模式

目前,我的命令是:python manage.py inspectdb --database "oradb" > test_model.py

这只会输出一个包含from django.db import models的文件。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-07 03:17:20

César在Oracle支持方面的回答是正确的。但是,通过在两个地方修改django\db\backends\oracle\introspection.py,我能够生成一个粗略的模型。

get_table_list中的cursor.execute行更改为:

代码语言:javascript
复制
cursor.execute("SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'OTHERSCHEMA'")

user_table_colsALL_TAB_COLUMNS更改为get_table_description的第一个cursor.execute行中的以下内容:

代码语言:javascript
复制
cursor.execute("""
        SELECT
            column_name,
            data_default,
            CASE
                WHEN char_used IS NULL THEN data_length
                ELSE char_length
            END as internal_size
        FROM ALL_TAB_COLUMNS
        WHERE table_name = UPPER(%s)""", [table_name])

接下来,将get_table_description中的第二个cursor.execute行更改为:cursor.execute("SELECT * FROM OTHERSCHEMA.%s WHERE ROWNUM < 2" % self.connection.ops.quote_name(table_name))

由于这是一个遗留数据库,其中的策略阻止了对数据库的更改,因此这对于一次性运行是很好的。

一旦模型完成,还需要做更多的更改。我的一些类似乎缺少主键引用和外键引用。我将手动添加这些内容。

我所做的最后一个更改是修改所有class Meta:实例以引用正确的模式:

代码语言:javascript
复制
class Meta:
    db_table = u'"SCHEMA"."TABLE_NAME"'     # Notice the quoting needed
票数 4
EN

Stack Overflow用户

发布于 2012-08-07 01:27:11

问题是Django的inspectdb不支持Oracle。从文档中:

inspectdb可以与PostgreSQL、MySQL和SQLite协同工作。外键检测仅适用于PostgreSQL和某些类型的MySQL表。

database选项可用于指定要自省的数据库。

票数 1
EN

Stack Overflow用户

发布于 2016-01-20 22:19:34

如果有人遇到这个帖子:安迪的建议+我还更改了get_relations方法,以在生成的源代码中获取外键,在1.9.1中工作:

代码语言:javascript
复制
    def get_relations(self, cursor, table_name):
    """
    Returns a dictionary of {field_name: (field_name_other_table, other_table)}
    representing all relationships to the given table.
    """
    table_name = table_name.upper()

    cursor.execute("""
        SELECT a.column_name, c_pk.table_name r_table_name, c_pk.constraint_name r_pk
          FROM all_cons_columns a
          JOIN all_constraints c ON a.owner = c.owner
                                AND a.constraint_name = c.constraint_name
          JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
                                   AND c.r_constraint_name = c_pk.constraint_name
         WHERE c.constraint_type = 'R'
           AND a.table_name = %s""", [table_name])

    relations = {}
    for row in cursor.fetchall():
        relations[row[0].lower()] = (row[2].lower(), row[1].lower())
    return relations
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11832817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档