SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例
Posted
技术标签:
【中文标题】SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例【英文标题】:SQL ALCHEMY - How to return query(model).all() as a tuple of values instead of model instance 【发布时间】:2021-11-09 12:14:50 【问题描述】:我在我的项目中使用 SQL Alchemy,但我很难找出如何简单地查询模型并返回元组列表作为结果。
我有一个简单的模型:
class Security(Base):
__tablename__ = 'Securities'
id = Column(Integer, primary_key=True, autoincrement=True)
ticker = Column(String, index= True)
company = Column(String)
sector = Column(String)
industry = Column(String)
country = Column(String)
当我在会话中查询这个模型时,我得到一个模型作为回报:
s = Session()
q = s.query(Security).all()
如果我只是打印查询,我会得到一个模型类的列表。
[<models.Security at 0x7ff6eaf75a90>,
<models.Security at 0x7ff6eaf759a0>,
<models.Security at 0x7ff6eaf75940>,
<models.Security at 0x7ff6eaf758e0>,
<models.Security at 0x7ff6eaf75040>,
<models.Security at 0x7ff6eaf750a0>,
<models.Security at 0x7ff6eaf75100>,
<models.Security at 0x7ff6eaf75070>,
<models.Security at 0x7ff6eaf751c0>,..
所以我现在找到了解决方案:
[(i.id, i.ticker, i.company, i. sector, i.industry, i.country) for i in q]
有没有更蟒蛇的方式来做到这一点? 当我用mysql--connector-python(或者pymysql,记不得了)查询我的数据库时,结果会直接打印为一个元组列表。
【问题讨论】:
【参考方案1】:如果你想获取元组而不是模型实例,你可以查询底层的 Table 对象而不是模型类,例如
# 1.x style
rows = session.query(Security.__table__).all()
# 2.0 style
rows = session.execute(sa.select(Security.__table__)).all()
请注意,这些方法可能不适用于关系。
如果应用程序被设计为仅处理原始元组,那么使用 SQLAlchemy 的 ORM 层就没有什么意义了 - 使用核心层代替您可以直接使用 Table
对象。
【讨论】:
非常感谢。这正是我一直在寻找的。我整个上午都在寻找这个。【参考方案2】:另一种方法是利用select(Thing)
这一事实
Session.execute()
,我们会返回 ORM 对象,但是
如果我们使用Connection.execute()
,我们会得到类似元组的LegacyRow
对象
class Thing(Base):
__tablename__ = "thing"
id = Column(Integer, primary_key=True, autoincrement=False)
txt = Column(String(50))
with Session(engine) as sess:
query = select(Thing)
results = sess.execute(query).all()
pprint(results)
"""
[(<__main__.Thing object at 0x000000FD8375C0D0>,),
(<__main__.Thing object at 0x000000FD8375C160>,)]
"""
with sess.connection() as conn:
results = conn.execute(query).all()
pprint(results)
"""
[(1, 'foo'), (2, 'bar')]
"""
【讨论】:
以上是关于SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sql Alchemy Python 中为 MS SQL 后端指定事务隔离级别
如何在 SQL Alchemy 中仅将 Python 表达式用作混合属性
python 如何使用SQL Alchemy编译INSERT ... ON DUPLICATE KEY UPDATE并支持批量插入。
如何使用 Active Directory 集成身份验证通过 python SQL alchemy 连接到 Azure sql 数据库