Rufen Sie Abfrageergebnisse als Diktat in SQLAlchemy ab
P粉187160883
P粉187160883 2023-10-20 13:59:52
0
2
806

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粉187160883
P粉187160883

Antworte allen(2)
P粉486743671

您可以使用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粉421119778

更新了 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.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'}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage