在 SQLAlchemy 中检索查询结果作为字典

新手上路,请多包涵

我正在使用 flask SQLAlchemy,我有以下代码来使用来自 MySQL 数据库的原始 SQL 查询从数据库中获取用户:

 connection = engine.raw_connection()
cursor = connection.cursor()
cursor.execute("SELECT * from User where id=0")
results = cursor.fetchall()

results 变量是一个元组,我希望它是 dict() 类型。有没有办法做到这一点?

当我使用 pymysql 建立数据库连接时,我能够做到

cursor = connection.cursor(pymysql.cursors.DictCursor)

SQLAlchemy 中有类似的东西吗?

注意:我想做这个改变的原因是摆脱在我的代码中使用 pymysql,并且只使用 SQLAlcehmy 功能,即我不想在我的代码中的任何地方“导入 pymysql”。

原文由 M.Alsioufi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

结果是一个元组,我希望它是 dict() 类型

SQLAlchemy 1.4 的更新答案:

版本 1.4 弃用了旧的 engine.execute() 模式并改变了方式 .execute() 在内部运行。 .execute() 现在返回一个带有 .mappings() 方法的 CursorResult 对象:

 import sqlalchemy as sa

# …

with engine.begin() as conn:
    qry = sa.text("SELECT FirstName, LastName FROM clients WHERE ID < 3")
    resultset = conn.execute(qry)
    results_as_dict = resultset.mappings().all()
    pprint(results_as_dict)
    """
    [{'FirstName': 'Gord', 'LastName': 'Thompson'},
     {'FirstName': 'Bob', 'LastName': 'Loblaw'}]
    """

(SQLAlchemy 1.3 的先前答案)

如果您使用 engine.execute 而不是 raw_connection() ,SQLAlchemy 已经为您做了这件事。 With engine.execute , fetchone will return a SQLAlchemy Row object and fetchall will return a list of Row 对象。 Row 可以通过键访问对象,就像 dict 一样:

 sql = "SELECT FirstName, LastName FROM clients WHERE ID = 1"
result = engine.execute(sql).fetchone()
print(type(result))  # <class 'sqlalchemy.engine.result.Row'>
print(result['FirstName'])  # Gord

如果你需要一个真正的 dict 对象那么你可以转换它:

 my_dict = dict(result)
print(my_dict)  # {'FirstName': 'Gord', 'LastName': 'Thompson'}

原文由 Gord Thompson 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 sqlalchemy 游标和游标的描述。

 def rows_as_dicts(cursor):
    """convert tuple result to dict with cursor"""
    col_names = [i[0] for i in cursor.description]
    return [dict(zip(col_names, row)) for row in cursor]

db = SQLAlchemy(app)
# get cursor
cursor = db.session.execute(sql).cursor
# tuple result to dict
result = rows_as_dicts(cursor)

原文由 Sucas Venior 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题