我需要定义多个包含 SQLAlchemy 声明类的模块。我在每个名为 subclass_base()
的模块中编写了一个函数,在实例化后将 declarative_base()
的 Base 实例传递到该函数中。第一个模块的 subclass_base()
调用正确地对 Base 实例进行子类化,并且子类从函数外部可见。第二个模块的调用没有错误地完成,但在函数内部和外部,所有子类仅在某些时候反射(reflect)在 Base.__subclasses__
中。这是一个最小的工作示例,每个模块中只有 1 个类定义:
模型.py
from sqlalchemy import Column, Integer, String
def subclass_base(Base):
class Roles(Base):
__tablename__ = 'roles'
id = Column(Integer, primary_key=True)
name = Column(String(32))
模型b.py
from sqlalchemy import Column, Integer, String
def subclass_base(Base):
class Locations(Base):
__tablename__ = 'locations'
id = Column(Integer, primary_key=True)
name = Column(String(64))
测试.py
from sqlalchemy.ext.declarative import declarative_base
from modela import subclass_base as amod
from modelb import subclass_base as bmod
def test():
count = 0
while True:
try:
Base = declarative_base()
amod(Base)
bmod(Base)
sc = [subclass.__name__ for subclass in Base.__subclasses__()]
assert(len(sc) == 2)
print('.', end='')
count += 1
except AssertionError:
print("Failed after {} successful pass(es)".format(count))
count = 0
我怀疑这个问题是我忽略了与 declarative_base() 一起进行的元类工作的一个特定问题,但我似乎无法弄清楚发生了什么。我也想知道这是否是一个继承问题。我是否应该采用不同的架构方法而不是使用函数来子类化单个基类?
最佳答案
不要在函数中定义类。只需在单个定义模块中定义 Base
,然后从其他模块导入该模块:
数据库文件
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Session = sessionmaker()
def bind_engine(engine):
Base.metadata.bind = engine
Session.configure(bind=engine)
模型.py
from sqlalchemy import Column, Integer, String
from db import Base
class Roles(Base):
__tablename__ = 'roles'
id = Column(Integer, primary_key=True)
name = Column(String(32))
模型b.py
from sqlalchemy import Column, Integer, String
from db import Base
class Locations(Base):
__tablename__ = 'locations'
id = Column(Integer, primary_key=True)
name = Column(String(64))
用户脚本.py
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pwd@server/database')
from yourproject.db import bind_engine
bind_engine(engine)
关于python - 如何将 SQLAlchemy 声明性模型拆分为模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51106264/