Как проверить существование строки в SQLite с помощью Python?

У меня есть указатель с запросом следующим образом:

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

Я хочу проверить наличие компонентов: имя и вернуться к переменной python. Как мне это сделать?

Поскольку name s уникально, я действительно fetchone метод (метод OP) использования метода fetchone или Alex Martelli для использования SELECT count(*) по моему первоначальному предложению использования fetchall .

fetchall обертывает результаты (как правило, несколько строк данных) в списке. Поскольку name s уникально, fetchall возвращает либо список с одним кортежем в списке (например, [(rowid,),] либо пустой список [] . Если вы хотите знать rowid , то использование fetchall требует, fetchall вы норовали через список и кортеж, чтобы добраться до rowid .

Использование fetchone лучше в этом случае, поскольку вы получаете только одну строку (rowid,) или None . Чтобы попасть в rowid (при условии, что он есть), вам просто нужно выбрать первый элемент кортежа.

Если вам rowid конкретный rowid и вы просто хотите знать, что есть удар, то вы можете использовать предложение Alex Martelli, SELECT count(*) , которое вернет либо (1,) либо (0,) .

Вот пример кода:

Сначала скопируйте код котельной для настройки таблицы 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',)) 

Использование 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)))))) 

выходы:

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

Использование 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])) 

выходы:

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

Использование 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)) 

выходы:

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

Я нашел ответ.

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

Как указывают оба существующих ответа (ваш собственный и @ unutbu), трюк заключается в том, что после выполнения SELECT необходимо выполнить некоторую выборку, чтобы проверить, были ли какие-либо результаты в выборе или нет (независимо от того, выполняете ли вы он с единственной выборкой и проверкой на отсутствие, или на выборки и проверка на пустой список, является предельной разницей – учитывая, что вы указываете ограничение UNIQUE это в основном эквивалентные подходы).

Для очень прямого ответа вы можете select count(*) from components where name = ? , вместо того, чтобы выбирать rowid , если вам все равно, является ли данное значение для имени присутствующим или нет (в отличие от того, что касается того, какой идентификатор строки он включен, если вообще ;-). Выполнение этого выбора и выбор результата дает 0 если значение отсутствует, 1 если оно присутствует (никакой другой результат невозможен, учитывая то, что вы упомянули в комментарии об ограничении UNIQUE для name столбца ;-).

Чтобы сделать его еще короче …:

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