web-dev-qa-db-fra.com

Python, comment vérifier si un jeu de résultats est vide?

J'ai une déclaration SQL qui ne renvoie aucun résultat. Par exemple, 'select * from TAB where 1 = 2'.

Je veux vérifier combien de lignes sont retournées, 

cursor.execute(query_sql)

rs = cursor.fetchall()

Ici j'obtiens déjà une exception: "(0, 'Aucun résultat défini')" 

Comment puis-je prévoir cette exception, vérifier si le jeu de résultats est vide?

27
Tao Venzke

cursor.rowcount sera généralement mis à 0.

Si, toutefois, vous exécutez une instruction qui never renverra un ensemble de résultats (tel que INSERT sans RETURNING ou SELECT ... INTO), vous n'avez pas besoin d'appeler .fetchall(); il n'y aura pas de résultat défini pour de telles déclarations. L'appel de .execute() suffit pour exécuter l'instruction.


Notez que les adaptateurs de base de données sont également autorisés à définir le nombre de lignes sur -1 s'il ne peut pas déterminer le nombre exactement affecté. Voir la Spécification PEP 249 Cursor.rowcount :

L'attribut est -1 si aucune .execute*() n'a été effectuée sur le curseur ou si le nombre de lignes de la dernière opération n'est pas déterminé par l'interface.

La bibliothèque sqlite3 est encline à le faire. Dans tous les cas, si vous devez connaître le nombre de lignes affecté à l'avance, exécutez d'abord une COUNT() select dans la même transaction.

32
Martijn Pieters

MySQLdb ne lèvera pas d'exception si le jeu de résultats est vide. De plus, la fonction cursor.execute () retournera une valeur longue qui correspond au nombre de lignes dans le jeu de résultats récupéré. Donc, si vous voulez vérifier les résultats vides, votre code peut être ré-écrit comme

rows_count = cursor.execute(query_sql)
if rows_count > 0:
     rs = cursor.fetchall()
else:
     // handle empty result set
12
thavan

Rowcount me renvoyait toujours -1 quelle que soit la solution que j'ai essayée.

J'ai trouvé le suivant un bon remplacement pour vérifier un résultat nul.

c.execute("SELECT * FROM users WHERE id=?", (id_num,))
row = c.fetchone()
if row == None:
   print("There are no results for this query")
6
Piney

Remarque: Ceci concerne le module MySQLdb en Python.

Pour une instruction SELECT, il ne devrait pas y avoir d'exception pour un jeu d'enregistrements vide. Juste une liste vide ([]) pour cursor.fetchall() et None pour cursor.fetchone().

Pour toute autre déclaration, par exemple INSERT ou UPDATE, qui ne renvoie pas de jeu d'enregistrements, vous ne pouvez ni appeler fetchall() ni fetchone() sur le curseur. Sinon, une exception sera levée.

Il existe un moyen de distinguer les deux types de curseurs ci-dessus:

def yield_data(cursor):
    while True:
        if cursor.description is None:
            # No recordset for INSERT, UPDATE, CREATE, etc
            pass
        else:
            # Recordset for SELECT, yield data
            yield cursor.fetchall()
            # Or yield column names with
            # yield [col[0] for col in cursor.description]

        # Go to the next recordset
        if not cursor.nextset():
            # End of recordsets
            return
4
Rockallite

si vous vous connectez à une base de données postgres, les opérations suivantes fonctionnent:

result = cursor.execute(query)

if result.returns_rows:
    # we got rows!
    return [{k:v for k,v in Zip(result.keys(), r)} for r in result.rows]
else:
    return None
0
Ryan Tuck

Vous pouvez faire comme ça:

count = 0
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=serverName;"
                      "Trusted_Connection=yes;")
cursor = cnxn.cursor()
cursor.execute(SQL query)
for row in cursor:
    count = 1
    if true condition:
        print("True")
    else:
        print("False")
if count == 0:
    print("No Result")

Merci :)

0