如何使用 SQLAlchemy (v1.4) 将行作为未命名的元组获取
How to fetch rows as unnamed tuples with SQLAlchemy (v1.4)
我正在使用 SQLAlchemy 1.4,启用“未来模式”以增加与未来 SQLAlchemy 2.0 的兼容性(尽管根据 [=12= 启用的警告,我仍然没有启用 100% 兼容性) ] 环境变量).
现在我正在做这样的查询:
with self.__db_engine.connect() as conn:
rs = conn.execute(
get_jobs_df_query.where(jobs_cols.target_market_id == target_market_id)
)
rows = rs.fetchall()
和 rows
成为“字典”列表(尽管底层对象可能是其他对象),因此我可以使用字符串索引访问它的字段,如下所示:
row_0_field_x = rows[0]["x"]
这在大多数情况下都非常好,但我 need/want(对于某些特定情况)访问行时就好像它们是未命名的元组一样,而不关心每一列的名称。我的主要原因是性能,以及与其他库(如 numpy
)更容易的互操作性,而无需引入太多胶水代码。
有什么简单的方法可以直接获取这样的无名元组吗?
感谢您的帮助。
如问题评论中所述,您的代码(engine.future=True
)会将每一行 return 作为一个对象 (<class 'sqlalchemy.engine.row.Row'>
),其行为类似于命名元组。然而,如果你真的需要一个简单的元组,你可以直接转换它:
with engine.begin() as conn:
result = conn.execute(
sa.text("SELECT 'Alfa' as foo, 'Bravo' as bar")
).fetchone()
print(type(result)) # <class 'sqlalchemy.engine.row.Row'>
result = tuple(result)
print(type(result)) # <class 'tuple'>
print(result) # ('Alfa', 'Bravo')
我正在使用 SQLAlchemy 1.4,启用“未来模式”以增加与未来 SQLAlchemy 2.0 的兼容性(尽管根据 [=12= 启用的警告,我仍然没有启用 100% 兼容性) ] 环境变量).
现在我正在做这样的查询:
with self.__db_engine.connect() as conn:
rs = conn.execute(
get_jobs_df_query.where(jobs_cols.target_market_id == target_market_id)
)
rows = rs.fetchall()
和 rows
成为“字典”列表(尽管底层对象可能是其他对象),因此我可以使用字符串索引访问它的字段,如下所示:
row_0_field_x = rows[0]["x"]
这在大多数情况下都非常好,但我 need/want(对于某些特定情况)访问行时就好像它们是未命名的元组一样,而不关心每一列的名称。我的主要原因是性能,以及与其他库(如 numpy
)更容易的互操作性,而无需引入太多胶水代码。
有什么简单的方法可以直接获取这样的无名元组吗?
感谢您的帮助。
如问题评论中所述,您的代码(engine.future=True
)会将每一行 return 作为一个对象 (<class 'sqlalchemy.engine.row.Row'>
),其行为类似于命名元组。然而,如果你真的需要一个简单的元组,你可以直接转换它:
with engine.begin() as conn:
result = conn.execute(
sa.text("SELECT 'Alfa' as foo, 'Bravo' as bar")
).fetchone()
print(type(result)) # <class 'sqlalchemy.engine.row.Row'>
result = tuple(result)
print(type(result)) # <class 'tuple'>
print(result) # ('Alfa', 'Bravo')