2010-03-04 66 views
46

我有以下在一個文件中,user.sql SQL:SQLite - 從文件運行多行SQL腳本?

CREATE TABLE user 
(
    user_id INTEGER PRIMARY KEY, 
    username varchar(255), 
    password varchar(255) 
); 

然而,當執行以下命令:生成

sqlite3 my.db < user.sql 

以下錯誤:

Error: near line 1: near ")": syntax error 

我寧願保留SQL,因爲該文件將被檢入到源代碼管理中,並且會像現在一樣更易於維護和可讀。 SQL可以像這樣跨越多行,還是我需要把它全部放在同一行上?

+0

當你試了一下,發生了什麼?你有沒有嘗試'sqlite3 mydb.db 2010-03-04 15:45:37

+0

與您提供的代碼段相比,您的錯誤消息沒有多大意義。在第1行沒有「)」。你能提供'user.sql'的實際代碼嗎? – 2010-03-04 16:36:15

+0

另外請注意,有些數據庫不喜歡沒有(!)空行結束的腳本。 – KFleischer 2014-03-09 12:28:25

回答

24

我有完全相同的問題。

然後我注意到,我的編輯器(Notepad ++)報告了Macintosh格式的行尾。

將eols轉換成Unix風格將腳本文件轉換爲sqlite3可以理解的格式。

2

多行不是問題。可能會有平臺問題,因爲我能夠在OS X 10.5.8上使用SQLite3 3.6.22成功運行此示例。

20

我意識到這不是對你的問題的直接回答。正如Brian所言,這可能是一個愚蠢的平臺問題。

如果通過Python的使用SQLite接口,你可能會避免大多數特定於平臺的問題,你有好玩的東西像datetime列:-)

像這樣的東西應該很好地工作:

import sqlite3 

qry = open('create_table_user.sql', 'r').read() 
conn = sqlite3.connect('/path/to/db') 
c = conn.cursor() 
c.execute(qry) 
conn.commit() 
c.close() 
conn.close() 
+14

感謝你的幫助和簡潔的代碼@bernie。對於其他人在未來的遇到這樣的:如果你在你的SQL文件中有一個以上的語句,我們c.executescript(QRY),而不是c.execute(QRY) – 2012-07-20 00:55:49

+0

謝謝你的評論,喬丹。這很可能對這個主題的未來讀者有所幫助。要添加一個小音符約'executescript()':它不是DB-API標準的一部分(http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript),所以一些Python數據庫庫可能不會實現它。 – bernie 2012-07-20 16:04:43

1

這裏是伯尼的蟒蛇例如升級處理腳本異常,而不是默默地失敗(Windows 7中的ActiveState的Python 3.X)

import sqlite3 
import os 
import os.path 
import ctypes 

databaseFile = '.\\SomeDB.db' 
sqlFile = '.\\SomeScripts.sql' 

# Delete the old table 
if os.path.isfile(databaseFile): 
    os.remove(databaseFile) 

# Create the tables 
qry = open(sqlFile, 'r').read() 
sqlite3.complete_statement(qry) 
conn = sqlite3.connect(databaseFile) 
cursor = conn.cursor() 
try: 
    cursor.executescript(qry) 
except Exception as e: 
    MessageBoxW = ctypes.windll.user32.MessageBoxW 
    errorMessage = databaseFile + ': ' + str(e) 
    MessageBoxW(None, errorMessage, 'Error', 0) 
    cursor.close() 
    raise