我有这样的表定义:
class A():
__tablename__ = 'a'
a_id = Column('a_id', INTEGER)
class B():
__tablename__ = 'b'
b_id = Column('b_id', INTEGER)
除了<tablename>_id
列中的差异之外,表具有相同的架构,这是常见的情况,我需要同时查询两者。
由于遗留原因,我无法将class属性重命名为id
,但是可以添加属性。我正在寻找一些类似的东西
class A():
__tablename__ = 'a'
a_id = Column('a_id', INTEGER)
id = alias_of_column(a_id)
有没有类似的东西?
答案 0 :(得分:1)
sqlalchemy.orm.synonym
是在其他属性上镜像列的最直接方法。
从文档中
从最基本的意义上讲,同义词是确定某项内容的简便方法 属性可以使用其他名称...
并且:
synonym()可以用于任何类型的映射属性 子类MapperProperty,包括映射的列和关系, 以及同义词本身。
用法就像您问题中的示例一样简单:
from sqlalchemy.orm import synonym
class B(Base):
__tablename__ = 'b'
b_id = Column('b_id', INTEGER, primary_key=True)
id = synonym('b_id')
此测试代码:
s.add(B(id=1))
s.commit()
print(s.query(B).filter(B.id==1).one())
...发出此sql:
2019-03-31 20:54:05,208 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-03-31 20:54:05,209 INFO sqlalchemy.engine.base.Engine INSERT INTO b (b_id) VALUES (%(b_id)s)
2019-03-31 20:54:05,209 INFO sqlalchemy.engine.base.Engine {'b_id': 1}
2019-03-31 20:54:05,211 INFO sqlalchemy.engine.base.Engine COMMIT
2019-03-31 20:54:05,218 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2019-03-31 20:54:05,219 INFO sqlalchemy.engine.base.Engine SELECT b.b_id AS b_b_id
FROM b
WHERE b.b_id = %(b_id_1)s
2019-03-31 20:54:05,219 INFO sqlalchemy.engine.base.Engine {'b_id_1': 1}
B(b_id=1)