SQL ALCHEMY - 如何返回 query(model).all() 作为值元组而不是模型实例

Pau*_*gne 2 python sqlalchemy

我在我的项目中使用 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)
Run Code Online (Sandbox Code Playgroud)

当我在会话中查询此模型时,我会得到一个模型作为回报:

s = Session()
q = s.query(Security).all()
Run Code Online (Sandbox Code Playgroud)

如果我只是打印查询,我会得到模型类的列表。

[<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>,..
Run Code Online (Sandbox Code Playgroud)

所以我现在找到了一个解决方案:

[(i.id, i.ticker, i.company, i. sector, i.industry, i.country) for i in q]
Run Code Online (Sandbox Code Playgroud)

有没有更Pythonic的方法来做到这一点?当我使用 mysql--connector-python (或 pymysql,不记得了)查询数据库时,结果将直接作为元组列表打印出来。

sna*_*erb 5

例如,如果您想获取元组而不是模型实例,您可以查询基础Table对象而不是模型类

# 1.x style
rows = session.query(Security.__table__).all()

# 2.0 style
rows = session.scalars(sa.select(Security.__table__)).all()
Run Code Online (Sandbox Code Playgroud)

请注意,这些方法可能不适用于人际关系。

如果应用程序被设计为处理原始元组,那么使用 SQLAlchemy 的 ORM 层就没有什么意义 - 使用核心层,而不是可以Table直接处理对象的层。