Получите результаты запроса как dict в SQLAlchemy - PullRequest
0 голосов
/ 01 ноября 2019

Я использую флягу SQLAlchemy, и у меня есть следующий код для получения пользователей из базы данных с необработанным SQL-запросом из базы данных MySQL:

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» был в моем коде где-либо.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2019

Я бы лично использовал панд:

import pandas as pd
connection = engine.raw_connection()
df = pd.read_sql_query('SELECT * from User where id=0' , connection)
mydict = df.to_dict()
0 голосов
/ 04 ноября 2019

Если raw_connection() возвращает объект PyMySQL Connection, вы можете продолжать использовать 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'}]
0 голосов
/ 01 ноября 2019

results - это кортеж, и я хочу, чтобы он имел тип dict ()

SQLAlchemy уже делает это за вас, если вы используете engine.execute вместо raw_connection(). С engine.execute, fetchone вернет объект SQLAlchemy Row, а fetchall вернет list из 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'}
...