gpt4 book ai didi

python - SQLAlchemy 将表联合映射到类

转载 作者:行者123 更新时间:2023-11-30 23:13:41 29 4
gpt4 key购买 nike

我正在使用 SQLAlchemy 查询多个相似的表,然后合并结果。这些表是客户信息行,但我们当前的数据库对其进行了结构化,以便不同的客户组位于自己的表中,例如客户端_组1、客户端_组2、客户端_组3:

client_group1:
| id | name | email |
| 1 | john | johnsmith@gmail.com |
| 2 | greg | gregjones@gmail.com |

其他每个表都有相同的列。如果我使用 SQLAlchemy declarative_base,我可以为 client_group1 创建一个类,如下所示:

def ClientGroup1(Base):
__tablename__ = 'client_group1'
__table_args__ = {u'schema': 'clients'}

id = Column(Integer, primary_key=True)
name = Column(String(32))
email = Column(String(32))

然后我可以进行如下查询:

session.query(ClientGroup1.name)

但是,如果我使用 union_all 将一堆客户端表组合到一个视口(viewport)中,例如:

query1 = session.query(ClientGroup1.name)
query2 = session.query(ClientGroup2.name)
viewport = union_all(query1, query2)

然后我不确定如何将视口(viewport)映射到对象,而是必须使用以下方式访问视口(viewport)列:

viewport.c.name

有没有办法将视口(viewport)映射到特定的表结构?特别是考虑到每个类都指向不同的 __table_name__

最佳答案

阅读Concrete Table Inheritance有关如何做到这一点的想法的文档。下面的代码是如何完成此操作的运行示例:

from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.orm import sessionmaker, configure_mappers
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import AbstractConcreteBase

engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(engine)


class ClientGroupBase(AbstractConcreteBase, Base):
pass


class ClientGroup1(ClientGroupBase):
__tablename__ = 'client_group1'
# __table_args__ = {'schema': 'clients'}
__mapper_args__ = {
'polymorphic_identity': 'client_group1',
'concrete': True,
}

id = Column(Integer, primary_key=True)
name = Column(String(32))
email = Column(String(32))


class ClientGroup2(ClientGroupBase):
__tablename__ = 'client_group2'
# __table_args__ = {'schema': 'clients'}
__mapper_args__ = {
'polymorphic_identity': 'client_group2',
'concrete': True,
}

id = Column(Integer, primary_key=True)
name = Column(String(32))
email = Column(String(32))


def _test_model():
# generate classes for all tables
Base.metadata.create_all()
print('-'*80)

# configure mappers (see documentation)
configure_mappers()
print('-'*80)

# add some test data
session.add(ClientGroup1(name="name1"))
session.add(ClientGroup1(name="name1"))
session.add(ClientGroup2(name="name1"))
session.add(ClientGroup2(name="name1"))
session.commit()
print('-'*80)

# perform a query
q = session.query(ClientGroupBase).all()
for r in q:
print(r)


if __name__ == '__main__':
_test_model()

上面的示例还有一个额外的好处,您还可以创建新对象,以及仅查询某些表。

您可以将 SQL VIEW 映射到类,但您需要显式指定主键(请参阅 Is possible to mapping view with class using mapper in SqlAlchemy? )。在您的情况下,恐怕这可能不起作用,因为多个表中的 PK 值相同,并且使用多列 PK 可能不是最好的主意。

关于python - SQLAlchemy 将表联合映射到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29188962/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com