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