2010-03-13 11 views
29

que tienen el cursor con la instrucción de consulta de la siguiente manera:¿Cómo verificar la existencia de una fila en SQLite con Python?

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

Quiero comprobar la existencia de los componentes: nombre y volver a una variable pitón. ¿Cómo hago eso?

+2

¿Quieres comprobar si es NULL o si existe la columna en el esquema del todo ?? – AndiDog

+0

No, el nombre de la columna es ÚNICO, así que quiero seleccionar los componentes con ese nombre, si existe o no. Perdón por extrañar algunos detalles –

+1

Si ha encontrado la solución, debe seleccionar una respuesta para marcar esta pregunta como respondida. Preferentemente, la respuesta de otra persona que te indicó el camino correcto. –

Respuesta

69

Desde los name s son únicos, realmente favorecen su método (del PO) de utilizar fetchone o método de usar SELECT count(*) sobre mi sugerencia inicial de usar fetchall de Alex Martelli.

fetchall ajusta los resultados (normalmente varias filas de datos) en una lista. Dado que 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 explore la lista y la tupla para obtener a la rowid.

usando fetchone es mejor en este caso ya que tienes una sola fila, (rowid,) o None. para llegar a la rowid (siempre hay uno) sólo hay que escoger del primer elemento de la tupla

Si no le importa el particular rowid y solo quiere saber que hay un acierto, , entonces podría usar la sugerencia de Alex Martelli, SELECT count(*), que devolvería (1,) o (0,).

Aquí es un código de ejemplo:

Primera parte del código de la caldera de la placa de instalar una mesa sqlite 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',)) 

Usando 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 

Uso de 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 

Uso de 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) 
+0

hola unutbu, ¿puede ser más claro en la declaración python después de la asignación a los datos? Soy nuevo en Python –

+0

sin embargo, la columna 'nombre' en 'crear componentes de tabla' Tengo la propiedad ÚNICA, eso también es importante. Gracias por compartir los códigos. –

+0

¿Esto también funciona para python3? –

15

He encontrado la respuesta.

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

Lo hice funcionar primero haciendo 'cursor.execute (" SELECT * FROM mytable ")' – nobism

5

Como ambas respuestas existentes (su propio y @ de unutbu) señalan, el truco es que usted tiene que hacer algunos especie de ir a buscar, después de ejecutar el SELECT, para comprobar si se ha producido ningún resultado al seleccionar o no (si lo haces con una búsqueda única y no compruebas ninguno, o un fetch-all y compruebas si hay una lista vacía, es una diferencia marginal; dado que mencionas una restricción UNIQUE, son básicamente enfoques equivalentes))

Para una respuesta muy directa, usted podría select count(*) from components where name = ?, en lugar de seleccionar rowid, si lo que importa es si el valor dado por el nombre está presente o no (a diferencia de, preocuparse por lo Identificación fila que está encendido, si es que lo ;-). Al ejecutar esta selección y obtener el resultado, obtiene 0 si el valor está ausente, 1 si está presente (no es posible otro resultado dado lo que mencionó en un comentario sobre la restricción UNIQUE en la columna name ;-).

+0

hola Alex, de hecho, quiero verificar si existe y obtener el rowid también. Entonces, es por eso que puse el rowid en la declaración de selección. Su solución funciona perfectamente, pero en caso de que exista, tengo que hacer otra selección para obtener los resultados. ¿Podría dar un ejemplo de verificar con algunos códigos que puedo hacer para tener algunas comparaciones? (busque uno y compruebe ninguno frente a buscar-todo y marque el vacío) Lo siento, soy nuevo en python y sqlite3 –

+0

@fx, si necesita el código rowid, entonces el código de su auto-respuesta es correcto y esencialmente idéntico al de unutbu (con prueba en 'if data:' para verificar si hay una lista no vacía) - no es necesario hacer una comparación profunda. –

-1

para que sea aún más corto ...:

row = cursor.fetchone() 

if row: 
    print "row is present" 
else: 
    print "row is not present" 
Cuestiones relacionadas