【问题标题】:Point manage.py to a specific PostegreSQL schema将 manage.py 指向特定的 PostgreSQL 模式
【发布时间】:2012-10-05 22:46:50
【问题描述】:

如何让 manage.py 在特定的 PostgreSQL 架构中运行?

我的数据库被分成多个模式,每个客户端/部署一个,以保持数据分离。

然而,Django 似乎并不能很好地支持模式。如何使用 manage.py 为特定模式生成模型等?

【问题讨论】:

    标签: django postgresql psycopg2 django-postgresql


    【解决方案1】:

    这就是最终奏效的方法:

    我编写了一个新的 manage.py 命令,它封装了我想要识别模式的命令(syncdb、migrate、changepassword),并通过以下方式手动选择模式:

    from django.db import connection
    cursor = connection.cursor()
    cursor.execute('SET search_path TO ' + my_little_schema)
    

    【讨论】:

    • 我遇到了完全相同的问题。如果您发布有关您编写的包装工具的更多详细信息,我会很高兴。
    • @AgnivaDeSarker 命令包装器主要基于github.com/bcarneiro/django-tenant-schemas 中的命令包装器,它的作用基本相同。
    • 你应该使用 cursor.execute('SET search_path=%s', (schema,)) 因为它更安全(SQL 注入...)。
    【解决方案2】:

    您可以将默认架构分配给数据库用户,或者 - 准确地说 - 您可以将架构搜索 path 分配给用户。如果该路径仅包含单个架构,则您有效地为用户设置了默认架构。

    然后沿路径查找任何不合格的对象名称(表、视图、函数...)。不合格的 CREATE 语句将在搜索路径的第一个模式中创建对象。

    所以你需要做的就是改变 Django 用来连接数据库的用户:

    alter user django_user set search_path to the_one_schema;
    commit;
    

    之后,例如create table foo 将在架构 the_one_schema 中创建表。

    您需要注销然后重新登录才能使更改“生效”。

    【讨论】:

    • 有趣,但不是我想要的:(
    • 这是最简单、最一致的方法。你做一次,之后它总是有效的。
    猜你喜欢
    • 2017-05-18
    • 2017-06-03
    • 2011-10-06
    • 2012-08-06
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多