SQLAlchemy从ORM迁移到Core

时间:2016-03-29 19:40:01

标签: sqlalchemy

当我们最初构建我们的应用程序时,我们使用的是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__))

我可以直接访问我的表名,只是使用它们来清理它吗?

1 个答案:

答案 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(),但这就是你要做的。