2012-05-17 55 views
0

我在我的大腦從PHP + MySQL的轉移到Python和在我使用的SQLite作爲中介別的東西以後,因爲它是建立在當下的過程。Python的sqlite3的executescript()錯誤與多個插入

當我嘗試建立一個初始數據庫的工作,它拋出的INSERT聲明的錯誤INSERT的多重行:

import sqlite3 

query = """CREATE TABLE IF NOT EXISTS "users" (
      "userID" INTEGER PRIMARY KEY autoincrement, 
      "email" varchar(255) NOT NULL, 
      "forename" varchar(50) NOT NULL, 
      "surname" varchar(50) NOT NULL 
      ); 
      INSERT INTO "users" ("userID", "email", "forename", "surname") 
      VALUES 
      (1, '[email protected]', 'Test', 'User'), 
      (2, '[email protected]', 'Test', 'User');""" 

db_conn = sqlite3.connect('test.db') 
try: 
    db_conn.cursor().executescript(query) 
    db_conn.commit() 
except: 
    print "error with database" 
    raise 
finally: 
    db_conn.close() 

當我運行它,我得到:

error with database 
Traceback (most recent call last): 
    File "dbTest.py", line 20, in <module> 
    db_conn.cursor().executescript(query) 
sqlite2.OperationalError: near ",": syntax error 

我花了一段時間來找到到底是哪「」它不喜歡(我的意思是,真的嗎? SQL錯誤吸!)。這確實是將「INSERT」行分開的「,」。

我做什麼愚蠢的事情?

回答

1

爲了您插入我會用.executemany()代替如果可以的話,執行腳本。否則,如果你不能,你INSERT聲明將需要單獨爲每個VALUES設置想要傳遞。

query = """INSERT INTO "users" ("userID", "email", "forename", "surname") 
      VALUES 
      (?, ?, ?, ?) 
     """ 
user_list = ((1, '[email protected]', 'Test', 'User'), (2, '[email protected]', 'Test', 'User')) 
cursor.executemany("INSERT INTO myTable(data) values (?) ", user_list) 

編輯: 根據這一post,你其實可以在一個單一的INSERT聲明多個值的集合,但語法是遠離漂亮。

+0

ok,這有點痛苦 - 一旦設置好了,顯然不是問題,但是我想從mysql轉儲數據庫來啓動它並運行 – MalphasWats

+0

我發現了一篇類似於您的文章,它是鏈接在我的文章的編輯部分。它似乎有可能有多行插入,但語法看起來不太漂亮。 –

+0

啊,所以它是不是實際的SQLite支持的功能 - 根據該職位它是在3.7.11版本中增加,這也就是爲什麼這個頁面http://www.sqlite.org/lang_insert.html說,你可以讓他們,這就是我用它的原因!我必須有一個更老的版本 - 我只是使用我的Python安裝得到的任何東西!我寧願用手工輸入數據,也不願使用'UNION SELECT'!謝謝 – MalphasWats