我有以下管理SQLite数据库的DatabaseManager类:
class DatabaseManager(object):
def __init__(self, db):
self.conn = sqlite3.connect(db)
self.conn.execute('pragma foreign_keys = on')
self.conn.commit()
self.cur = self.conn.cursor()
在我的应用程序的某一点上,我需要检查我的数据库中是否已经存在某个给定的文章,如果确实存在,我想要它的id
。我使用DatabaseManager的以下方法:
def article_exists(self, url):
self.cur.execute('SELECT id FROM articles WHERE url = ?', (url,))
self.conn.commit()
ids = list(self.cur)
if len(ids) == 0:
return (False, None)
if len(ids) == 1:
return (True, ids[0][0])
else:
print 'Duplicate articles:', url
return (True, ids[0][0])
出于某种原因,如果文章已经存在,生成的ids
列表有时会包含两个具有相同ID的元素,例如[(3,), (3,)]
。你知道为什么会这样吗?
我想我可以使用self.cur.fetchone()
;但是,我发现这种行为很奇怪。
更新
articles
的表定义:
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
title TEXT,
url TEXT,
authors TEXT,
abstract TEXT );
每当出现此问题时,我还会收到以下错误消息:
InterfaceError:绑定参数0时出错 - 可能是不支持的类型。
但是,我也检查变量url
的类型,它总是一个字符串,这是正确的类型。
我正在运行Ubuntu 12.04 LTS而sys.version
给出了:
2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3]
答案 0 :(得分:0)
唯一可能的结论似乎是您确实在数据库表中有重复的条目。由于您没有显示表格定义,因此无法说明这是如何产生的,但看起来ID
列(我认为它应该是主键)似乎不是&#39 ; t唯一索引,从而允许重复值。
答案 1 :(得分:0)
我找到了导致错误消息的原因。处理完每篇文章后,我还会更新processed
标志 - 相关"消息表中的一列"对象:
def set_processed(self, msgid):
self.cur.execute('UPDATE messages SET processed=1 WHERE id = ?', (msgid,))
但是,此方法缺少提交行:
self.conn.commit()
添加后,所有内容都可以正常运行。
(但是,如果有人能解释为什么会这样,我会很高兴知道!)