如何在Django中使用模式?

时间:2009-07-21 17:30:54

标签: python django postgresql django-models

我想在django中使用postgreSQL模式,我该怎么做?

9 个答案:

答案 0 :(得分:27)

我一直在使用:

db_table = '"schema"."tablename"'

过去没有意识到只能用于只读操作。当您尝试添加新记录时,它将失败,因为序列将类似于“schema.tablename”_column_id_seq。

db_table = 'schema\".\"tablename'

到目前为止确实有效。感谢。

答案 1 :(得分:25)

也许这会有所帮助。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'OPTIONS': {
            'options': '-c search_path=your_schema'
        },
        'NAME': 'your_name',
        'USER': 'your_user',
        'PASSWORD': 'your_password',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

我从以下链接得到答案: http://blog.amvtek.com/posts/2014/Jun/13/accessing-multiple-postgres-schemas-from-django/

答案 2 :(得分:11)

这比棘手的逃避要复杂一点。看看Django中的Ticket #6148可能是一个解决方案,或者至少是一个补丁。它在django.db核心深处进行了一些小的改动,但它有望被正式包含在django中。 之后,这只是一个问题

db_schema = 'whatever_schema'
元类中的

或全局变更集

DATABASE_SCHEMA = 'default_schema_name'
在settings.py

更新时间:2015-01-08

django中的相应问题已经开放了7年,那里的补丁将不再适用。 对此的正确答案应该是......

目前你不能在开箱即用的django中使用postgreSQL模式。

答案 3 :(得分:7)

如以下门票所述: https://code.djangoproject.com/ticket/6148,我们可以为django用户设置search_path

实现此目的的一种方法是通过search_path客户端设置psql,例如

ALTER USER my_user SET SEARCH_PATH TO path;

另一种方法是修改django应用程序,这样如果我们重建数据库,django就不会吐出public模式中的所有表。

要实现此目的,您可以覆盖django.db.backends.postgresql_psycopg2.base

中定义的DatabaseWrapper
  1. 创建以下目录:

    app/pg/
    ├── __init__.py
    └── base.py
    
  2. 以下是base.py

    的内容
    from django.db.backends.postgresql_psycopg2.base import DatabaseWrapper
    
    class DatabaseWrapper(DatabaseWrapper):
        def __init__(self, *args, **kwargs):
            super(DatabaseWrapper, self).__init__(*args, **kwargs)
    
        def _cursor(self):
            cursor = super(DatabaseWrapper, self)._cursor()
            cursor.execute('SET search_path = path')
            return cursor
    
  3. settings.py中,添加以下数据库配置:

    DATABASES = {
        'default': {
            'ENGINE': 'app.pg',
            'NAME': 'db',
            'USER': 'user',
            'PASSWORD': '',
            'HOST': '',
            'PORT': '',
        }
    }
    

答案 4 :(得分:6)

我刚刚为此问题开发了一个软件包:https://github.com/ryannjohnson/django-schemas

完成一些配置后,您只需在模型上调用set_db()

model_cls = UserModel.set_db(db='db_alias', schema='schema_name')
user_on_schema = model_cls.objects.get(pk=1)

该软件包使用https://stackoverflow.com/a/1628855/5307109https://stackoverflow.com/a/18391525/5307109中描述的技术,然后将它们包装起来以便与Django模型一起使用。

答案 5 :(得分:2)

对于postgreSQL模式没有明确的Django支持。

  

当使用Django(0.95)时,我们不得不为PostgreSQL的Django数据库连接器添加一个search_path,因为Django不支持指定由ORM管理的表所使用的模式。

取自:

http://nxsy.org/using-postgresql-schemas-with-sqlalchemy-and-elixir

一般的反应是使用SQLAlchemy正确构造SQL。

哦,这是另一个关于你可以用Django基础做什么的建议的链接,扩展它以试图支持你的方案:

http://news.ycombinator.com/item?id=662901

答案 6 :(得分:2)

我只是说了一些成功

db_table = 'schema\".\"tablename'
元类中的

,但这真的很难看。我只在有限的情况下使用它 - 如果你尝试复杂的东西,它可能会破裂。如前所述,它并没有得到真正的支持......

答案 7 :(得分:2)

我知道这是一个相当古老的问题,但另一种解决方案是改变SEARCH_PATH。

实施例

假设你有三张桌子。

  1. schema1.table_name_a
  2. schema2.table_name_b
  3. table_name_c
  4. 您可以运行命令:

    SET SEARCH_PATH to public,schema1,schema2;
    

    仅在django中通过表名引用表。

    请参阅5.7.3. The Schema Search Path

答案 8 :(得分:1)

对于SQL Server数据库:

rideBarButton.applyNavBarConstraints(size: (width: 50, height: 44)) //expected height and width