2014-06-06 92 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

相關問題