suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Rufen Sie Abfrageergebnisse als Diktat in SQLAlchemy ab

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粉187160883P粉187160883407 Tage vor776

Antworte allen(2)Ich werde antworten

  • P粉486743671

    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)

    Antwort
    0
  • P粉421119778

    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.executefetchone将返回一个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'}
    

    Antwort
    0
  • StornierenAntwort