2011-03-05 115 views
5

此代碼:sqlite3.OperationalError:近 「X」:語法錯誤

conn = connect('emails.db') 
curs = conn.cursor() 

curs.execute('''create table items 
    (integer primary key, X, Y)''') 

curs.execute("INSERT INTO items (integer primary key, X, Y) VALUES ('today', 'X', 'Y')") 

connection.commit() 

回報:

sqlite3.OperationalError: near "primary": syntax error

怎麼來的?我不明白我做錯了什麼。我放在那裏的值是所有變量btw。

+1

SQLite「鐵路」語法圖非常有用,例如, http://www.sqlite.org/lang_createtable.html ...頂級在這裏:http://www.sqlite.org/lang.html – 2011-03-05 12:57:16

回答

9

您的CREATE TABLE不正確:它沒有爲第一個('整數主鍵')列指定一個名稱。 SQLite現在認爲該字段爲,名稱爲integer,並且沒有定義數據類型。你可能想要一個INTEGER PRIMARY KEY字段,因爲這非常有效。要做到這一點,尊重CREATE TABLE syntax,並給它一個名字:

CREATE TABLE items 
(id INTEGER PRIMARY KEY 
, x DOUBLE 
, y DOUBLE 
); 

作爲一個方面說明:我定義X和Y雙打,因爲指定的類型僅僅是很好的做法,也是稍微高效。當然,如果你想在其中放置文本,請將它們定義爲TEXT。或者,如果您希望它們主要包含整數,請將它們定義爲INTEGER。如果你真的不知道你會在那裏放置什麼樣的數據,那麼只需要忽略數據類型。

接下來,由於INSERT statement只需要字段名(而不是其全部定義),SQLite會引發語法錯誤 - 正確的。

最後,你覺得把'今天'(一個文本值)放到一個整數列中有點愚蠢嗎?


編輯:既然你說X和Y是變量,不妨把你在正確的軌道上,在這些變量綁定到SQL語句:

curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y}) 

我離開出id主鍵字段,因爲如果它不存在,SQLite會自動生成。如果你想傳遞一個明確的價值,你可以。但要注意它是一個整數,而且它是唯一的!

在SQL語句中的:X:Y參數指的是字典的XY成員作爲第二個參數execute語句通過。

綁定參數是both safer and faster,而不是將參數包含到SQL字符串本身中。

+0

做:X和:Y工作在sqlite3 python驅動程序?記錄的唯一替換參數是'?'。 – SilverbackNet 2012-07-09 21:42:56

+1

@SilverbackNet:他們呢,也是根據[這個評論](http://stackoverflow.com/a/1010804/60590) – Martijn 2012-07-10 20:29:20

+0

謝謝!這增加了我在開始使用SQLite時失去的靈活性。 – SilverbackNet 2012-07-10 23:46:15

相關問題