SQL ALCHEMY - 如何 return query(model).all() 作为值的元组而不是模型实例
SQL ALCHEMY - How to return query(model).all() as a tuple of values instead of model instance
我正在为我的项目使用 SQL Alchemy,但我很难找到如何简单地查询模型和 return 元组列表的结果。
我有一个简单的模型:
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)
当我在一个会话中查询这个模型时,我在 return:
中得到一个模型
s = Session()
q = s.query(Security).all()
如果我简单地打印查询,我会得到一个模型列表 class。
[<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]
是否有更 pythonic 的方法来做到这一点?
当我使用 mysql--connector-python(或 pymysql,不记得了)查询我的数据库时,结果将直接作为元组列表打印出来。
如果您想获取元组而不是模型实例,您可以查询底层 Table 对象而不是模型 class,例如
# 1.x style
rows = session.query(Security.__table__).all()
# 2.0 style
rows = session.execute(sa.select(Security.__table__)).all()
请注意,这些方法可能不适用于关系。
如果应用程序设计为仅处理原始元组,那么使用 SQLAlchemy 的 ORM 层就没有什么意义了——使用核心层来代替 Table
直接对象。
另一种方法是利用 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,但我很难找到如何简单地查询模型和 return 元组列表的结果。
我有一个简单的模型:
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)
当我在一个会话中查询这个模型时,我在 return:
中得到一个模型s = Session()
q = s.query(Security).all()
如果我简单地打印查询,我会得到一个模型列表 class。
[<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]
是否有更 pythonic 的方法来做到这一点? 当我使用 mysql--connector-python(或 pymysql,不记得了)查询我的数据库时,结果将直接作为元组列表打印出来。
如果您想获取元组而不是模型实例,您可以查询底层 Table 对象而不是模型 class,例如
# 1.x style
rows = session.query(Security.__table__).all()
# 2.0 style
rows = session.execute(sa.select(Security.__table__)).all()
请注意,这些方法可能不适用于关系。
如果应用程序设计为仅处理原始元组,那么使用 SQLAlchemy 的 ORM 层就没有什么意义了——使用核心层来代替 Table
直接对象。
另一种方法是利用 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')]
"""