sqlite3.操作错误:接近“WHERE”:语法错误(Python 2,sqlite3)

4 投票
2 回答
10985 浏览
提问于 2025-04-18 08:50

我遇到了一个错误,怎么也解决不了:

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/')

撰写回答