sqlite3.操作错误:接近“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的字符串操作(真是可怕!),甚至喝了杯酒。到目前为止,什么都没用。
2 个回答
0
也许在SQLite中情况有所不同,但通常在一个值的语句中是不能加条件的。你可以试试下面这样的写法:
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/')
如果像这样 (values (1)) as T 这种写法不被支持的话,可能可以找找类似于Oracle的dual表或者DB2的sysibm.sysdummy1这样的东西。
4
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/')