在SQLAlchemy中按dict检索查询结果

时间:2019-11-01 11:43:26

标签: python mysql sqlalchemy flask-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”。

4 个答案:

答案 0 :(得分:0)

  

results是一个元组,我希望它的类型为dict()

如果您使用engine.execute而不是raw_connection()

SQLAlchemy已经为您完成了此操作。使用engine.executefetchone将返回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'}

答案 1 :(得分:0)

我会亲自使用熊猫:

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

答案 2 :(得分:0)

如果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'}]

答案 3 :(得分:0)

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

<div class="parent">
   <div class="child">Some Stuff</div>
</div>