python - 列名称的 sqlalchemy 别名也保留原始名称

标签 python sqlalchemy

我的表定义如下:

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

class B():
    __tablename__ = 'b'
    b_id = Column('b_id', INTEGER)

除了 <tablename>_id 中的差异外,表具有相同的架构列,这是我需要同时查询两者的常见情况。
由于遗留原因,我无法将类属性重命名为 id但我可以添加一个属性。我正在寻找类似的东西

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

有类似的吗?

最佳答案

sqlalchemy.orm.synonym是在另一个属性上镜像列的最直接方法。

来自文档:

In the most basic sense, the synonym is an easy way to make a certain attribute available by an additional name...

还有:

The synonym() can be used for any kind of mapped attribute that subclasses MapperProperty, including mapped columns and relationships, as well as synonyms themselves.

用法就像您问题中的示例一样简单:

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)

关于python - 列名称的 sqlalchemy 别名也保留原始名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55439089/

相关文章:

python - 在python中获取每个客户的每个订单行之前的最后一个订单ID

python - 当我将迭代器分配给变量时发生了什么

python - 忽略正则表达式中文件中间的 xml 标记(带有非捕获组?)

python - 如何在 SQLAlchemy 中指定一个关系,其中一个条件要求一列为空?

python - 使用 sqlalchemy-cockroachdb 时导入作业消失

python - SQLAlchemy:按关系过滤

python - 如何测试是否有服务器在 python 端口上打开?

python - 对 Python 函数的最佳/最差情况时间的答案感到困惑

python - 如何使用 SQLAlchemy 和 Alembic 在 Python 中使用 Redshift 方言进行迁移?

python - SQLAlchemy 对一个类的多个身份进行多态