簡體   English   中英

在 SQLAlchemy 中檢索查詢結果作為 dict

[英]Retrieve query results as dict in SQLAlchemy

I am using flask SQLAlchemy and I have the following code to get users from database with raw SQL query from a MySQL database:

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 功能,即我不想在我的代碼中的任何地方都有'''import pymysql'''。

results 是一個元組,我希望它是 dict() 類型

SQLAlchemy 1.4 的更新答案:

1.4 版棄用了舊的engine.execute()模式並改變了.execute()內部的操作方式。 .execute()現在返回帶有.mappings ()方法的 CursorResult object:

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 已經為您執行此操作。 使用engine.executefetchone將返回一個 SQLAlchemy Row object 並且fetchall將返回一個Row對象list 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 object 那么你可以轉換它:

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

您可以使用 sqlalchemy cursor 和光標的描述。

 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)

如果raw_connection()返回一個 PyMySQL Connection object 那么你可以繼續使用DictCursor像這樣:

engine = create_engine("mysql+pymysql://root:whatever@localhost:3307/mydb")
connection = engine.raw_connection()
cursor = connection.cursor(pymysql.cursors.DictCursor)
cursor.execute("SELECT 1 AS foo, 'two' AS bar")
result = cursor.fetchall()
print(result)  # [{'foo': 1, 'bar': 'two'}]

我個人會使用 pandas:

import pandas as pd
connection = engine.raw_connection()
df = pd.read_sql_query('SELECT * from User where id=0' , connection)
mydict = df.to_dict()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM