我有一个带有查询语句的游标,如下所示:
cursor.execute("select rowid from components where name = ?", (name,))
我想检查组件的存在:name并返回python变量.我怎么做?
由于name
s是唯一的,我真的很喜欢你的(OP的)使用方法fetchone
或Alex Martelli的使用方法SELECT count(*)
超过我最初使用的建议fetchall
.
fetchall
将结果(通常是多行数据)包装在列表中.由于name
s是唯一的,fetchall
返回列表中只有一个元组的列表(例如,[(rowid,),]
或者是一个空列表[]
.如果你想知道rowid
,那么使用fetchall
需要你挖掘列表和元组才能到达rowid
.
fetchone
在这种情况下使用更好,因为你只得到一行,(rowid,)
或者None
.要获得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
,如果您关心的是名称的给定值是否存在(而不是关心它是什么行ID,如果有的话;-).执行此选择并获取结果,0
如果存在该值,则会显示该值是否1
存在(鉴于您在UNIQUE
关于列的约束的注释中提到的内容,没有其他结果可行name
;-).