我想在django中使用postgreSQL模式,我该怎么做?
答案 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
创建以下目录:
app/pg/
├── __init__.py
└── base.py
以下是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
在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/5307109和https://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基础做什么的建议的链接,扩展它以试图支持你的方案:
答案 6 :(得分:2)
我只是说了一些成功
db_table = 'schema\".\"tablename'
元类中的,但这真的很难看。我只在有限的情况下使用它 - 如果你尝试复杂的东西,它可能会破裂。如前所述,它并没有得到真正的支持......
答案 7 :(得分:2)
我知道这是一个相当古老的问题,但另一种解决方案是改变SEARCH_PATH。
假设你有三张桌子。
schema1.table_name_a
schema2.table_name_b
table_name_c
您可以运行命令:
SET SEARCH_PATH to public,schema1,schema2;
仅在django中通过表名引用表。
答案 8 :(得分:1)
对于SQL Server数据库:
rideBarButton.applyNavBarConstraints(size: (width: 50, height: 44)) //expected height and width