关于python:在sqlalchemy中为同一个声明性Base使用不同的模式

Using a different schema for the same declarative Base in sqlalchemy

我对金字塔和炼金术都不熟悉。我正在用sqlacalchemy开发一个python金字塔项目。我在下面建立了一个简单的模型。如何在运行时将其用于不同的模式?这将是一个PostgreSQL数据库后端。现在,"public"被硬编码到声明性基础模型中。我需要能够将这个相同的模型用于不同的模式。最好的方法是什么?除非我错过了,否则sqlacalchemy的文档对我来说似乎不清楚。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, BigInteger

    __all__ = [
       "LoadTender"
    ]
    __all__.sort()

    Base = declarative_base()


    class LoadTender(Base):
        __tablename__ ="load_tenders"
        __table_args__ = {"schema":"public"}

        id = Column("pkey", BigInteger, primary_key=True)

        def __repr__(self):
            return"" % self.id

编辑:我似乎已经解决了我的问题,我正在更新代码片段以显示我在下面做了什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, BigInteger

__all__ = [
   "LoadTender"
]
__all__.sort()

Base = declarative_base()

class ClientMixin(object):
    __table_args__ = {"schema":"client_schema_name"}


class LoadTenderMixin(object):
    __tablename__ ="load_tenders"

    id = Column("pkey", BigInteger, primary_key=True)

    def __repr__(self):
        return"" % self.id


class ClientLoadTender(LoadTenderMixin, ClientMixin, Base):
    pass


我认为每个模式需要不同的模型。__abstract__可以减轻这种痛苦。这是保罗尹的回答…

  • 定义一个__abstract__loadTender模型,这样就不必一直对它进行编码。

    1
    2
    3
    4
    5
    #base.py
    class LoadTender(Base):
        __abstract__ = True
        id = ...
        def __repr__ ...
  • 为每个架构在层次结构中放置一个特定于架构的基。

    1
    2
    3
    4
    5
    6
    7
    #schema1.py
    from base import LoadTender

    PublicBase = declarative_base(metadata=MetaData(schema='public'))

    class LoadTender(PublicBase, LoadTender):
        __tablename__ = 'load_tenders'

  • 对其他模式执行相同的操作。


  • 在包模型中可以有一个基本模块

    1
    2
    3
    4
    5
    6
    7
    app\
        models\
            base.py
            schema1.py
            schema2.py
        views\
        ...

    在base.py中声明Base,然后将其导入其他模式


    只是个猜测

    1
    LoadTender.__table_args__["schema"] ="whatever"

    最好把它放在应用程序配置程序创建应用程序的地方。