如何在Django中使用模式?

vnc*_*ado 27 python django postgresql django-models

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

小智 28

也许这会有所帮助.

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',
    }
}
Run Code Online (Sandbox Code Playgroud)

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


k4m*_*4ml 27

我一直在用:

db_table = '"schema"."tablename"'
Run Code Online (Sandbox Code Playgroud)

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

db_table = 'schema\".\"tablename'
Run Code Online (Sandbox Code Playgroud)

到目前为止工作.谢谢.

  • 我不使用PostgreSQL,但这也是我在SQL Server中使用它的方式. (2认同)
  • 在创建表之前在同步数据库中自动创建架构的任何技巧?运行测试套件所必需的。 (2认同)

kmp*_*mpm 11

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

db_schema = 'whatever_schema'
Run Code Online (Sandbox Code Playgroud)

在Meta类或全局变更集中

DATABASE_SCHEMA = 'default_schema_name'
Run Code Online (Sandbox Code Playgroud)

在settings.py中

更新时间:2015-01-08

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

目前你不能在开箱即用的django中使用postgreSQL架构.

  • 不知何故,在Django 1.3.1中,这种方法不起作用. (3认同)

Min*_*gyu 7

如下面的故障单中所述:https: //code.djangoproject.com/ticket/6148,我们可以search_path为django用户设置.

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

ALTER USER my_user SET SEARCH_PATH TO path;
Run Code Online (Sandbox Code Playgroud)

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

为此,您可以覆盖DatabaseWrapper定义的django.db.backends.postgresql_psycopg2.base

  1. 创建以下目录:

    app/pg/
    ??? __init__.py
    ??? base.py
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. settings.py,添加以下数据库配置:

    DATABASES = {
        'default': {
            'ENGINE': 'app.pg',
            'NAME': 'db',
            'USER': 'user',
            'PASSWORD': '',
            'HOST': '',
            'PORT': '',
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


rya*_*son 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)
Run Code Online (Sandbox Code Playgroud)

该软件包使用/sf/answers/114019881//sf/answers/1287406781/中描述的技术,然后将它们包装起来以便与Django模型一起使用.


Alb*_*oPL 2

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

使用 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