当我们最初构建我们的应用程序时,我们使用的是SQLAlchemy ORM,但随着时间的推移,我们对其复杂性和开销越来越感到沮丧,并希望在查询性能方面更快更明确。在一些早期的测试中,看起来核心满足了这些需求,所以我们想开始进行切换。
我们所有当前的模型都是使用Declarative定义的,例如:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
autocomplete_crosses = relationship(u'Parent')
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
user = Column(ForeignKey('users.id'), nullable=False)
name = Column(String(100), nullable=False)
users = relationship(User')
除了每次都需要调用__table__
之外,是否有一种更简单的方法可以使用声明。这就是我现在正在做的事情,感觉冗长和丑陋:
s = select([User.__table__.c.name, Parent.__table__.c.name])\
.select_from(User.__table__.join(Parent.__table__))
我可以直接访问我的表名,只是使用它们来清理它吗?
答案 0 :(得分:0)
如果您想自动为所有表格执行此操作,您可以在定义所有课程后反映出来:
for cls in Base._decl_class_registry.values():
if hasattr(cls, "__table__") and cls.__table__ is not None:
globals()[cls.__table__.name] = cls.__table__
我不建议这样做,因为它非常神奇。特别是,它会打破短语,因为它会修改globals()
,但这就是你要做的。