Python 如何在Django中使用模式?
如果我想在django中使用postgreSQL模式,我该怎么做?没有对postgreSQL模式的明确django支持 在使用Django(0.95)时,我们必须为PostgreSQL的Django数据库连接器添加一个搜索路径,因为Django不支持指定ORM管理的表所使用的模式 摘自: 一般的反应是使用SQLAlchemy正确地构造SQL 哦,这里还有另一个链接,提供了一些关于如何使用Django base的建议,扩展它以尝试支持您的计划:Python 如何在Django中使用模式?,python,django,postgresql,django-models,Python,Django,Postgresql,Django Models,如果我想在django中使用postgreSQL模式,我该怎么做?没有对postgreSQL模式的明确django支持 在使用Django(0.95)时,我们必须为PostgreSQL的Django数据库连接器添加一个搜索路径,因为Django不支持指定ORM管理的表所使用的模式 摘自: 一般的反应是使用SQLAlchemy正确地构造SQL 哦,这里还有另一个链接,提供了一些关于如何使用Django base的建议,扩展它以尝试支持您的计划: 我刚说了几句话就取得了一些成功 db_table
我刚说了几句话就取得了一些成功
db_table = 'schema\".\"tablename'
在元类中,但这真的很难看。我只在有限的场景中使用过它——如果你尝试一些复杂的事情,它可能会崩溃。如前所述,它实际上不受支持…我一直在使用:
db_table = '"schema"."tablename"'
在过去没有意识到只有只读操作才能工作。当您尝试添加新记录时,它将失败,因为序列类似于“schema.tablename”\u column\u id\u seq
db_table = 'schema\".\"tablename'
到目前为止还有效。谢谢。这比狡猾的逃跑要复杂一点。看看Django中的Ticket,也许可以找到一个解决方案,或者至少是一个补丁。它在django.db内核中做了一些细微的修改,但有望正式包含在django中。 在那之后,只是说说而已
db_schema = 'whatever_schema'
在元类中或对于全局更改集
DATABASE_SCHEMA = 'default_schema_name'
在settings.py中
更新:2015-01-08
django的相应版本已经开放了7年,那里的补丁将不再有效。
对此的正确答案应该是
目前,您不能在django中使用现成的postgreSQL模式。我知道这是一个相当老的问题,但另一种解决方案是改变搜索路径 例子 假设你有三张桌子
schema1.table\u name\u a
schema2.table\u name\u b
table\u name\u c
SET SEARCH_PATH to public,schema1,schema2;
并仅在django中按表名引用表
请参见以下票据中提到的: ,我们可以为django用户设置
search\u path
实现这一点的一种方法是通过psql
客户端设置search\u path
,如
ALTER USER my_user SET SEARCH_PATH TO path;
另一种方法是修改django应用程序,这样如果我们重建数据库,django就不会在public
模式中吐出所有表
要实现这一点,您可以覆盖中定义的数据库包装器
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': '',
}
}
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',
}
}
我从以下链接得到答案:
我刚刚为这个问题开发了一个包: 经过一些配置后,您只需在您的机型上调用
set_db()
:
model_cls = UserModel.set_db(db='db_alias', schema='schema_name')
user_on_schema = model_cls.objects.get(pk=1)
该软件包使用和中所述的技术,然后将其包装以用于Django模型。对于SQL server数据库:
db_table = "[your_schema].[your_table]"
我不使用PostgreSQL,但这也是我在SQL Server中工作的方式。在创建表之前,在syncdb中自动创建模式有什么诀窍吗?运行测试套件所必需的。警告,使用命名可以工作,但如果使用syncdb或migrateWhere引入该指令,将无法创建索引。还需要记住,表名和架构名在postgres中区分大小写,这是因为补丁还没有实现。这在Django 1.6.1中仍然不起作用。为什么这个答案被标记为已接受?甚至有人怀疑它是否会被归类为一个……这张票上有一个补丁从未被包括在内,也可能永远不会被包括在内。在我写这篇文章的时候,它已经开放了7年。我可能接受了这个答案,因为早在2009年它就成功了。我应该删除已接受的标记吗?正确的答案在那里,至少在我更新之后。django中不使用模式。这确实很难看,因为这样你必须自己管理表名。这看起来是这个线程中唯一有效的解决方案,尽管很费劲。但是它如何与几个“应用程序”配合使用呢?@Luís de Sousa我看不出几个“应用程序”有任何问题。我们已经使用这种方法来解决生产中缺乏模式支持的问题1年多了,没有任何问题。Minguy,我自己也没有看到问题,我只是问如何做到这一点。我现在正在读Django书的第五章。有,由于未知的原因,目前关闭。在Oracle或Postgres上开发的系统中,经常会发现多个模式,而在Django中,这些模式对应于不同的应用程序。只有手动管理数据库时,这才有效。如果您在这个设置中使用
syncdb
,您将得到public
模式中的所有表。我刚刚从Django开始,我感到这种基本功能在本机上还不受支持。特别是有空位的时候。你能不能把这封信拆开?它不再有效。我不再经常使用Django,因此如果这个问题有一个好的答案,请让我现在就回答,这样我就可以标记为回答最好的。我自己也停止使用Django。我认为你不应该接受任何答案,因为没有一个能解决这个问题。您所能做的最好的事情就是更改搜索路径,但它仅在使用单个模式时有效。