Python sqlalchemy别名用于列名称,同时保留原始名称

Python sqlalchemy别名用于列名称,同时保留原始名称,python,sqlalchemy,Python,Sqlalchemy,我有这样的表格定义: class A(): __tablename__ = 'a' a_id = Column('a_id', INTEGER) class B(): __tablename__ = 'b' b_id = Column('b_id', INTEGER) 表具有相同的模式,除了\u id列中的差异,这是一种常见情况,我需要同时查询这两个表。 由于遗留原因,我无法将类属性重命名为id,但我可以添加一个属性。我在找一些类似于 class A():

我有这样的表格定义:

class A():
    __tablename__ = 'a'
    a_id = Column('a_id', INTEGER)

class B():
    __tablename__ = 'b'
    b_id = Column('b_id', INTEGER)
表具有相同的模式,除了
\u id
列中的差异,这是一种常见情况,我需要同时查询这两个表。
由于遗留原因,我无法将类属性重命名为
id
,但我可以添加一个属性。我在找一些类似于

class A():
    __tablename__ = 'a'
    a_id = Column('a_id', INTEGER)
    id = alias_of_column(a_id)
有类似的方法吗?

是在另一个属性上镜像列的最直接的方法

从文档中:

从最基本的意义上讲,同义词是一种简单的表达某种意义的方式 属性可用的附加名称

以及:

同义词()可以用于任何类型的映射属性 子类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)