J'ai le curseur avec l'instruction de requête comme suit:
cursor.execute("select rowid from components where name = ?", (name,))
Je veux vérifier l'existence des composants: nom et revenir à une variable python. Comment faire?
Étant donné que les name
sont uniques, je préfère vraiment votre méthode (l'OP) d'utiliser fetchone
ou la méthode d'Alex Martelli d'utiliser SELECT count(*)
par rapport à ma suggestion initiale d'utiliser fetchall
.
fetchall
encapsule les résultats (généralement plusieurs lignes de données) dans une liste. Puisque les name
sont uniques, fetchall
renvoie soit une liste avec un seul Tuple dans la liste (par exemple [(rowid,),]
ou une liste vide []
. Si vous désir de connaître le rowid
, puis utiliser fetchall
vous oblige à fouiller dans la liste et Tuple pour accéder au rowid
.
L'utilisation de fetchone
est préférable dans ce cas, car vous obtenez une seule ligne, (rowid,)
Ou None
. Pour accéder au rowid
(à condition qu'il y en ait un), il vous suffit de sélectionner le premier élément du Tuple.
Si vous ne vous souciez pas du rowid
particulier et que vous voulez juste savoir qu'il y a un hit, alors vous pouvez utiliser la suggestion d'Alex Martelli, SELECT count(*)
, qui retournerait soit (1,)
ou (0,)
.
Voici un exemple de code:
Tout d'abord, un code de plaque de chaudière pour configurer une table jouet sqlite:
import sqlite3
connection = sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('create table components (rowid int,name varchar(50))')
cursor.execute('insert into components values(?,?)', (1,'foo',))
en utilisant fetchall
:
for name in ('bar','foo'):
cursor.execute("SELECT rowid FROM components WHERE name = ?", (name,))
data=cursor.fetchall()
if len(data)==0:
print('There is no component named %s'%name)
else:
print('Component %s found with rowids %s'%(name,','.join(map(str, next(Zip(*data))))))
rendements:
There is no component named bar
Component foo found with rowids 1
en utilisant fetchone
:
for name in ('bar','foo'):
cursor.execute("SELECT rowid FROM components WHERE name = ?", (name,))
data=cursor.fetchone()
if data is None:
print('There is no component named %s'%name)
else:
print('Component %s found with rowid %s'%(name,data[0]))
rendements:
There is no component named bar
Component foo found with rowid 1
en utilisant SELECT count(*)
:
for name in ('bar','foo'):
cursor.execute("SELECT count(*) FROM components WHERE name = ?", (name,))
data=cursor.fetchone()[0]
if data==0:
print('There is no component named %s'%name)
else:
print('Component %s found in %s row(s)'%(name,data))
rendements:
There is no component named bar
Component foo found in 1 row(s)
J'ai trouvé la réponse.
exist = cursor.fetchone()
if exist is None:
... # does not exist
else:
... # exists
Comme le soulignent les deux réponses existantes (la vôtre et @ unutbu), l'astuce est que vous devez faire certains sorte de récupération, après avoir exécuté le SELECT
, pour vérifier s'il y a aucun résultat pour la sélection ou non (que vous le fassiez avec une seule extraction et que vous n'en recherchiez aucune, ou une extraction et que vous recherchiez une liste vide, est une différence marginale - étant donné que vous mentionnez un UNIQUE
contrainte, ce sont des approches essentiellement équivalentes).
Pour une réponse très directe, vous pouvez select count(*) from components where name = ?
, plutôt que de sélectionner rowid
, si tout ce qui vous importe est de savoir si la valeur donnée pour le nom est présente ou non (par opposition à, se soucier de quelle ligne id c'est allumé, le cas échéant ;-). L'exécution de cette sélection et la récupération du résultat vous donne 0
si la valeur est absente, 1
s'il est présent (aucun autre résultat n'est possible étant donné ce que vous avez mentionné dans un commentaire sur la contrainte UNIQUE
sur la colonne name
;-).
En commençant Python 3.8
, Et l'introduction de expressions d'affectation (PEP 572) (opérateur :=
), Nous pouvons légèrement modifier les réponses précédentes en capturant le résultat de cursor.fetchone()
dans le contrôle de condition et réutilisez-le pour extraire le contenu du résultat:
# cursor.execute("SELECT rowid FROM components WHERE name = ?", (name,))
if item := cursor.fetchone():
print(f'Component {name} found with rowid {item[0]}')
else:
print(f'There is no component named {name}')