¿Cómo verificar la existencia de una fila en SQLite con Python?

Tengo el cursor con la statement de consulta de la siguiente manera:

cursor.execute("select rowid from components where name = ?", (name,)) 

Quiero verificar la existencia de los componentes: nombrar y volver a una variable de python. ¿Cómo puedo hacer eso?

Como los name son únicos, realmente prefiero su método (el de OP) de usar fetchone o el método de Alex Martelli de usar el SELECT count(*) sobre mi sugerencia inicial de usar fetchall .

fetchall envuelve los resultados (generalmente, múltiples filas de datos) en una lista. Dado que los name s son únicos, fetchall devuelve una lista con solo una tupla en la lista (por ejemplo, [(rowid,),] o una lista vacía [] . Si desea conocer el rowid , entonces usar fetchall requiere que se fetchall a través de la lista y la tupla para llegar al rowid .

Usar fetchone es mejor en este caso, ya que solo tienes una fila, (rowid,) o None . Para llegar al rowid (siempre que haya uno) solo tienes que seleccionar el primer elemento de la tupla.

Si no te importa el rowid particular y solo quieres saber si hay un golpe, entonces puedes usar la sugerencia de Alex Martelli, SELECT count(*) , que devolvería o (1,) o (0,) .

Aquí hay un código de ejemplo:

Primero, un código de placa de caldera para configurar una mesa de sqlite de juguete:

 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',)) 

Utilizando 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)))))) 

rendimientos

 There is no component named bar Component foo found with rowids 1 

Utilizando 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])) 

rendimientos

 There is no component named bar Component foo found with rowid 1 

Usando el 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)) 

rendimientos

 There is no component named bar Component foo found in 1 row(s) 

He encontrado la respuesta.

 exist = cursor.fetchone() if exist is None: ... # does not exist else: ... # exists 

Como lo señalan ambas respuestas existentes (la suya y la de @ unutbu), el truco es que sí necesita hacer algún tipo de búsqueda, después de ejecutar SELECT , para verificar si ha habido resultados para la selección o no (si lo hace) con una sola búsqueda y verificación de ninguna, o una búsqueda de todo y una lista vacía, es una diferencia marginal, dado que menciona una restricción UNIQUE , son enfoques básicamente equivalentes).

Para una respuesta muy directa, puede select count(*) from components where name = ? , en lugar de seleccionar rowid , si lo único que le importa es si el valor dado para el nombre está presente o no (a diferencia de, preocuparse por la identificación de la fila en la que se encuentra, en todo caso ;-). La ejecución de esta selección y la obtención del resultado le da 0 si el valor está ausente, 1 si está presente (no es posible ningún otro resultado dado lo que mencionó en un comentario sobre la restricción UNIQUE en el name columna ;-).

Para hacerlo aún más corto …:

 row = cursor.fetchone() if row: print "row is present" else: print "row is not present"