[英]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.execute
, fetchone
將返回一個 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.