2014-06-06 90 views
3

我似乎无法让过去的以下错误:sqlite3.OperationalError:近 “WHERE”:语法错误(Python 2中,sqlite3的)

Traceback (most recent call last): 
    File "datascraper.py", line 352, in <module> 
    URL)) 
sqlite3.OperationalError: near "WHERE": syntax error 

它来自下面的代码(行352标) :

Table = someSQLtable //Has columns (providername, [other columns], providerlink) 
SQLDatabase = sqlite3.connect(someSQLDatabase.db) 
DBControl = cursor(SQLDatabase) 

Name = 'somestring' 
URL = 'http://www.someurl.com/stuff/' 

[...] # Random other lines 

DBControl.execute('''INSERT INTO '''+Table+''' (providername, providerlink) 
    VALUES (?, ?) WHERE NOT EXISTS (
            SELECT * FROM '''+Table+''' 
            WHERE '''+Table+'''.providerlink = ? 
            ); 
352)      ''', (Name, URL, URL)) 

作为参考,在Python包裹起来的SQL命令应该是这样的:

INSERT INTO someSQLtable (providername, providerlink) 
    VALUES ('somestring', 'http://www.someurl.com/stuff/') 
    WHERE NOT EXISTS (
     SELECT * FROM someSQLtable 
     WHERE someSQLtable.providerlink = 'http://www.someurl.com/stuff/') 

我的目标检查表是否已经包含有问题的条目,方法是检查表中是否有新检索的链接(这是唯一的),然后写入表中,如果表尚未存在。

与空白播放显示,外出现了一个网址上线352

我已经尝试过修改输入到另一个字符串,看看是否能工作,改变使用Python的字符串OPS代码(恐怖!),并喝了一杯。目前似乎没有任何工作。

回答

3

INSERT语句事情已经没有WHERE子句。

如果您在providerLink列具有唯一约束(如果没有,你应该创建一个),你可以简单地使用INSERT OR IGNORE

INSERT OR IGNORE INTO someSQLtable(providername, providerlink) 
    VALUES ('somestring', 'http://www.someurl.com/stuff/') 

否则,您必须更换VALUES子句与一个查询:

INSERT INTO someSQLtable(providername, providerlink) 
    SELECT 'somestring', 'http://www.someurl.com/stuff/' 
    WHERE NOT EXISTS (
     SELECT * FROM someSQLtable 
     WHERE providerlink = 'http://www.someurl.com/stuff/') 
0

也许它不同于我的sqllite,但通常你不能在值语句中有where子句。尝试是这样的:

INSERT INTO someSQLtable (providername, providerlink) 
SELECT 'somestring', 'http://www.someurl.com/stuff/' 
FROM (values (1)) as T 
WHERE NOT EXISTS (
    SELECT * FROM someSQLtable 
    WHERE someSQLtable.providerlink = 'http://www.someurl.com/stuff/') 

如果(值(1))作为不支持T,或许还有类似甲骨文的双重或DB2的SYSIBM.SYSDUMMY1

+0

我敢肯定,你不需要'FROM':INSERT INTO表(...)SELECT'',''WHERE NOT EXISTS(...)'should工作。 – user432

+0

根据标准,你必须从某些东西中进行选择,但也许SQLITE放松了这一点。 – Lennart

+0

是的,看看另一个答案。 – user432

相关问题