Maison  >  Questions et réponses  >  le corps du texte

Récupérer les résultats de la requête sous forme de dict dans SQLAlchemy

J'utilise Flask SQLAlchemy et j'ai le code suivant pour récupérer les utilisateurs d'une base de données via une requête SQL brute depuis une base de données MySQL :

connection = engine.raw_connection()
cursor = connection.cursor()
cursor.execute("SELECT * from User where id=0")
results = cursor.fetchall()

results La variable est un tuple et je veux qu'elle soit de type dict(). Y'a-t-il une quelconque façon de réussir cela?

Lorsque j'utilise pymysql pour établir la connexion à la base de données, je suis capable de le faire

cursor = connection.cursor(pymysql.cursors.DictCursor)

Y a-t-il quelque chose de similaire dans SQLAlchemy ?

Remarque : La raison pour laquelle je souhaite apporter cette modification est de me débarrasser de l'utilisation de pymysql dans mon code et d'utiliser simplement la fonctionnalité SQLAlcehmy, c'est-à-dire que je ne veux pas avoir "importer pymysql" n'importe où dans mon code.

P粉187160883P粉187160883364 Il y a quelques jours717

répondre à tous(2)je répondrai

  • P粉486743671

    P粉4867436712023-10-21 12:22:22

    Vous pouvez utiliser des curseurs sqlalchemy et des descriptions de curseur.

    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)

    répondre
    0
  • P粉421119778

    P粉4211197782023-10-21 00:09:40

    Réponse mise à jour pour SQLAlchemy 1.4 :

    La version 1.4 est obsolète, l'ancien engine.execute() 模式,并更改了 .execute() 内部运行的方式。 .execute() renvoie désormais un objet CursorResult avec la méthode .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'}]
        """
    

    (réponse précédente pour SQLAlchemy 1.3)

    Si vous utilisez engine.execute 而不是 raw_connection(),SQLAlchemy 已经为您完成了此操作。使用engine.executefetchone将返回一个SQLAlchemy Row对象,fetchall将返回一个list< /code> Row 对象。 Row 对象可以通过键访问,就像 dict idem :

    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
    

    Si vous avez besoin d'un dict objet réel, vous pouvez simplement le convertir :

    my_dict = dict(result)
    print(my_dict)  # {'FirstName': 'Gord', 'LastName': 'Thompson'}
    

    répondre
    0
  • Annulerrépondre