gpt4 book ai didi

python - 在 SQLAlchemy 中合并多个声明性基础

转载 作者:太空狗 更新时间:2023-10-29 19:27:41 25 4
gpt4 key购买 nike

是否可以将 _BoundDeclarativeMeta 实例与另一个实例合并?

例如:

from sqlalchemy.ext.declarative import declarative_base

Base1 = declarative_base()
Base2 = declarative_base()

# Something like this?
CombinedBase = Base1.merge(Base2)

实际上,在合并之前,我会从每个模型中继承 orm 模型。问题是我有一个独立的包,需要某些表才能工作。然而它将被另一个独立的包使用。

最佳答案

对于我的用例,这有效:

from sqlalchemy import MetaData

combined_meta_data = MetaData()

for declarative_base in [Base1, Base2]:
for (table_name, table) in declarative_base.metadata.tables.items():
combined_meta_data._add_table(table_name, table.schema, table)

或者,更好的是,自动合并所有声明性基础:

import gc
from sqlalchemy import MetaData

combined_meta_data = MetaData()

for declarative_base in ([obj for obj in gc.get_objects() if isinstance(obj, DeclarativeMeta)]):
for (table_name, table) in declarative_base.metadata.tables.items():
combined_meta_data._add_table(table_name, table.schema, table)

然后可以使用该元数据来创建与当前数据库的差异:

from sqlalchemy import create_engine
from alembic.migration import MigrationContext
from alembic.autogenerate import compare_metadata
import pprint

engine = create_engine(...)
migration_context = MigrationContext.configure(engine.connect())

diff = compare_metadata(migration_context, combined_meta_data)
pprint.pprint(diff)

关于python - 在 SQLAlchemy 中合并多个声明性基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954815/

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