当前位置:  开发笔记 > 编程语言 > 正文

如何使用Python检查SQLite中是否存在行?

如何解决《如何使用Python检查SQLite中是否存在行?》经验,为你挑选了3个好方法。

我有一个带有查询语句的游标,如下所示:

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

我想检查组件的存在:name并返回python变量.我怎么做?



1> unutbu..:

由于names是唯一的,我真的很喜欢你的(OP的)使用方法fetchone或Alex Martelli的使用方法SELECT count(*)超过我最初使用的建议fetchall.

fetchall将结果(通常是多行数据)包装在列表中.由于names是唯一的,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)



2> fx...:

我找到了答案.

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



3> Alex Martell..:

由于两个现有的回答(你自己和@ unutbu的)所指出的,关键是,你需要做一些排序取的,在执行后SELECT,检查是否有过任何结果到选择或没有(不管你做使用单个提取并检查无,或者获取全部并检查空列表,这是一个边际差异 - 假设您提到UNIQUE约束它们基本上是等效方法).

对于一个非常直接的答案,你可以select count(*) from components where name = ?,而不是选择rowid,如果您关心的是名称的给定值是否存在(而不是关心它是什么行ID,如果有的话;-).执行此选择并获取结果,0如果存在该值,则会显示该值是否1存在(鉴于您在UNIQUE关于列的约束的注释中提到的内容,没有其他结果可行name;-).

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有