Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中使用模式?_Python_Django_Postgresql_Django Models - Fatal编程技术网

Python 如何在Django中使用模式?

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

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

没有对postgreSQL模式的明确django支持

在使用Django(0.95)时,我们必须为PostgreSQL的Django数据库连接器添加一个搜索路径,因为Django不支持指定ORM管理的表所使用的模式

摘自:

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

哦,这里还有另一个链接,提供了一些关于如何使用Django base的建议,扩展它以尝试支持您的计划:


我刚说了几句话就取得了一些成功

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。我认为你不应该接受任何答案,因为没有一个能解决这个问题。您所能做的最好的事情就是更改搜索路径,但它仅在使用单个模式时有效。