检查sqlite3中是否存在行?

时间:2015-05-04 23:54:19

标签: python python-3.x sqlite

如何使用Python 3和sqlite3正确检查数据库表中是否存在行?

这是我的原始代码:

cursor.execute("SELECT name, age FROM people WHERE pin=?", (pin, ))
name, age = cursor.fetchone() or ('', 0)

所以目前我用or ('', 0)设置了默认值,我真的不喜欢这个。

有没有办法检查这个人是否已经存在?像这样(伪):

if cursor.exists("pin IN people"):
    cursor.execute("SELECT name, age FROM people WHERE pin=?", (pin, ))
    name, age = cursor.fetchone()

4 个答案:

答案 0 :(得分:3)

别打电话给fetchone();只需将游标视为迭代器:

for row in c.execute("SELECT name, age FROM ..."):
    name, age = row
    break
else:
    print("not found")

答案 1 :(得分:2)

这样的东西?

vals = cursor.execute("SELECT name, age FROM people WHERE pin=?", (pin, )).fetchone()

if vals:
    name, age = vals

答案 2 :(得分:1)

您可以使用计数查询:

if c.execute("SELECT count(*) FROM people WHERE pin=?", (pin, )).fetchone()[0] > 0:
    ...

答案 3 :(得分:0)

或者,如果您的表格很大,您可以使用EXISTS来验证查询,并且您可以使用pin上的索引受益,请查看此SO,这样您就可以:

c = cursor.execute("""SELECT EXISTS (SELECT 1 
                                     FROM people 
                                     WHERE pin=?
                                     LIMIT 1)""", (pin, )).fetchone()[0]
if c:
    ...

光标将返回(1,)(如果返回1行或更多行)或(0,)(如果返回无),c1/0fetchone()[0]将从上面获取整数值1/0

Exists可能会更高效,具体取决于您的表格大小,以及您在查询字段上是否设置了索引。