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?
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.
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
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")
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
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
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 :)