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
是在另一个属性上镜像列的最直接方法。
从文档:
在最基本的意义上,同义词是一种通过附加名称使某个属性可用的简单方法......
和:
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)
推荐阅读
- javascript - React:如何使用相同类型的多个上下文,同时允许孩子从所有上下文中读取数据
- php - 在 PHP 中创建一个 word 文件并将其附加到邮件中
- kotlin - KMM - 在项目“:shared”中找不到错误任务“embedAndSignAppleFrameworkForXcode”
- python - 来自元组列表的熊猫数据框 [(column, row, value)]
- mysql - 如何通过适当的引用从 MySQL 5.7 information_schema.columns 获取默认列值?
- excel - 带有文件名、特定文件夹和日期的 VBA 到 SaveAS
- linux-kernel - 使用 wireless.h 扫描接入点
- wordpress - 如何在新的 WordPress 页面模板中显示分类下的自定义帖子类型?
- c++ - 为什么这个 C++ 程序在链接未定义的引用错误时出现问题?
- amazon-web-services - AWS 使用 cli 将 Cname 记录更改为 A 记录