Heim > Fragen und Antworten > Hauptteil
Ich verwende Flask SQLAlchemy und habe den folgenden Code, um Benutzer aus einer Datenbank über eine unformatierte SQL-Abfrage aus einer MySQL-Datenbank abzurufen:
connection = engine.raw_connection() cursor = connection.cursor() cursor.execute("SELECT * from User where id=0") results = cursor.fetchall()
results
Die Variable ist ein Tupel und ich möchte, dass sie vom Typ dict() ist. Gibt es eine Möglichkeit, dies zu erreichen?
Wenn ich pymysql verwende, um die Datenbankverbindung aufzubauen, kann ich das tun
cursor = connection.cursor(pymysql.cursors.DictCursor)
Gibt es etwas Ähnliches in SQLAlchemy?
Hinweis: Der Grund, warum ich diese Änderung vornehmen möchte, besteht darin, die Verwendung von pymysql in meinem Code loszuwerden und nur die SQLAlcehmy-Funktionalität zu verwenden, d. h. ich möchte nirgendwo in meinem Code „pymysql importieren“ haben.
P粉4867436712023-10-21 12:22:22
您可以使用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)
P粉4211197782023-10-21 00:09:40
更新了 SQLAlchemy 1.4 的答案:
版本 1.4 已弃用旧的 engine.execute()
模式,并更改了 .execute()
内部运行的方式。 .execute()
现在返回 CursorResult 对象,带有 .mappings ()方法:
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
对象,fetchall
将返回一个list< /code>
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'}