2010-03-04 5 views
46

ich die folgende SQL in einer Datei, user.sql haben:SQLite - Mehrzeiliges SQL-Skript aus einer Datei ausführen?

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

Wenn jedoch der folgende Befehl ausgeführt:

sqlite3 my.db < user.sql 

Der folgende Fehler generiert:

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

Ich würde es vorziehen, die SQL unverändert zu lassen, da die Datei in die Quellcodeverwaltung eingecheckt wird und besser wartbar und lesbar ist wie sie jetzt ist. Kann die SQL mehrere Zeilen umfassen oder muss ich alles auf dieselbe Zeile setzen?

+0

Wenn Sie es einmal, was passiert ist? Hast du 'sqlite3 mydb.db

+0

Ihre Fehlermeldung ist im Vergleich zu dem von Ihnen bereitgestellten Code-Snippet nicht sehr sinnvoll. Es gibt kein ")" in Zeile 1. Können Sie den tatsächlichen Code von 'user.sql' bereitstellen? –

+0

Bitte beachten Sie auch, dass einige DBs keine Skripte mögen, die ohne (!) Eine Leerzeile enden. – KFleischer

Antwort

24

Ich hatte genau das gleiche Problem.

Dann bemerkte ich, mein Editor (Notepad ++) meldet Macintosh-Format für das Ende der Zeilen.

Konvertieren von Eols in Unix-Stil verwandelte die Skriptdatei in ein Format, das sqlite3 verstand.

2

Mehrere Zeilen sind kein Problem. Es kann ein Plattformproblem geben, da ich dieses Beispiel erfolgreich mit SQLite3 3.6.22 unter OS X 10.5.8 ausführen kann.

20

Ich weiß, dass dies keine direkte Antwort auf Ihre Frage ist. Wie Brian erwähnt, könnte dies ein albernes Plattformproblem sein.

Wenn Sie mit SQLite über Python-Schnittstelle, werden Sie wahrscheinlich die meisten plattformspezifische Probleme vermeiden und Sie bekommen, um Spaß Dinge wie Datetime-Spalten haben :-)

So etwas sollte gut funktionieren:

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

Danke für den hilfreichen und prägnanten Code, @bernie. Für andere in der Zukunft, die darauf stoßen: Wenn Sie mehr als eine Aussage in Ihrer SQL-Datei haben, uns c.executescript (qry) anstelle von c.execute (qry) –

+0

Vielen Dank für Ihren Kommentar, Jordanien. Es wird wahrscheinlich zukünftigen Lesern dieses Threads hilfreich sein. Um eine kleine Notiz über 'execscript()' hinzuzufügen: [es ist kein Standardteil der DB-API] (http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript), also Einige Python-Datenbankbibliotheken implementieren es möglicherweise nicht. – bernie

1

Hier wird Python Beispiel des bernie aktualisiert Ausnahmen im Skript zu behandeln, anstatt still Fehler (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 
Verwandte Themen