Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Поскольку name уникально, я действительно предпочитаю, чтобы вы (ОП) использовали метод fetchone или метод Алекса Мартелли, используя SELECT count(*) fetchone моего первоначального предложения использовать fetchall.

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

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

Если вас не интересует конкретный rowid и вы просто хотите знать, что есть попадание, вы можете использовать предложение Алекса Мартелли, 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)

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Начиная с Python 3.8 и введением выражений присваивания (PEP 572) (:= оператор), мы можем немного изменить предыдущие ответы, захватив результат cursor.fetchone() в проверке условий и повторно используя его для извлечения содержимого результата:

# 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}')

Ответ 5

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

row = cursor.fetchone()

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