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() 作为值的元组而不是模型实例的主要内容,如果未能解决你的问题,请参考以下文章