【问题标题】:django-db2 use different schema name than database usernamedjango-db2 使用与数据库用户名不同的模式名称
【发布时间】:2016-07-09 15:41:48
【问题描述】:

在 Django 数据库中,用户名用作模式名称。

在 DB2 中没有数据库级用户。操作系统用户将用于登录数据库。

在我的数据库中,数据库用户和数据库架构有两个不同的名称。
那么在以 db2 作为后端的 django 中,如何使用不同的模式名称来访问表?

编辑: 澄清我正在尝试通过 ORM 而不是原始 SQL 访问。 ORM 隐式使用用户名作为模式名称。我该如何避免呢?

【问题讨论】:

    标签: django python-2.7 django-models db2


    【解决方案1】:

    得到了解决方案:

    1) 我们可以使用以下查询来更改 db2 中的模式:

    set schema schema_name;
    

    2) 我们可以在 django 启动时执行上述查询。 我们必须在任何 urls.py、manage.py 文件中添加以下代码,这些文件将在启动时运行。

    def set_schema(sender, **kwargs):
        from django.db import connection
        cursor = connection.cursor()
        try:
            cursor.execute("set schema schema_name")
        except Exception as e:
            print str(e)
    
    from django.db.backends.signals import connection_created
    connection_created.connect(set_schema)
    

    【讨论】:

    • **kwargs 是什么意思?
    • 另外,我已经添加到 manage.py 中,它仍然可能会进入用户名模式。
    【解决方案2】:

    DB2 使用所谓的两部分名称schemaname.objectname。每个对象(包括表)都可以通过全名引用。在会话中,当前模式默认设置为用户名。它可以通过SET SCHEMA myschema 语句进行更改。

    对于您的问题,有两种选择: 1) 引用表的全名:schemaname.tablename 2) 使用set schema 设置通用模式名并仅引用表。

    【讨论】:

    • 我应该在哪里添加“SET SCHEMA myschema”?在访问模型时,我们如何使用不同的模式名称,因为默认情况下它将用作 username.model_name?
    • 另外我想访问默认的 django 表(例如用于身份验证的表),以便从不同于数据库用户的模式名称访问。
    • 谢谢 Henrik,我们如何要求 ORM 使用不同的架构?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多