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"