(SELECT * FROM table)对于fetchone()和迭代具有不同的结果

时间:2019-03-26 04:45:27

标签: python sqlite

我在循环中,尝试检查表中是否已存在特定条目-如果不是,我将其插入,如果已存在,则将对其进行更新。我尝试在fetchone()之后进行c.execute(SELECT * ),它总是返回None,但是如果我尝试使用for result in c.execute(SELECT * )进行迭代,则会得到预期的结果。

此迭代器有效,要么给我我希望找到的条目,而且我知道该条目在那里,要么完全跳过我所不知道的id_str(在代码中使用此条目没有意义,因为该条目是唯一的,因此循环运行一次或永远不会运行,但我将其运行以进行测试):

for result in db_api.cursor().execute("SELECT * FROM fav_history WHERE tweet_id_str=?", (id_str,)):
#do stuff

但是,这个

db_api.cursor().execute("SELECT * FROM fav_history WHERE tweet_id_str=?", (id_str,))
result = db_api.cursor().fetchone()
if result is None:
#insert
else:
#update

result始终为None,即使我知道表中的id_str也是如此。

我想念什么?如何以正确有效的方式进行检查?

1 个答案:

答案 0 :(得分:1)

第二种情况下的问题是,当您实际访问结果集时正在生成一个新的游标。而是为光标定义一个变量,然后重用该变量:

cursor = db_api.cursor()
cursor.execute("SELECT * FROM fav_history WHERE tweet_id_str=?", (id_str,))
result = cursor.fetchone()
if result is None:
    # insert
else:
    # update