查询结果集中的重复元素& InterfaceError:错误绑定参数

时间:2014-12-13 17:29:25

标签: python sql sqlite

我有以下管理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]

2 个答案:

答案 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()

添加后,所有内容都可以正常运行。

(但是,如果有人能解释为什么会这样,我会很高兴知道!)