Ответ 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)