2010-03-04 18 views
46

Ho il seguente SQL in un file, user.sql:SQLite - Esegui lo script SQL multilinea dal file?

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

Tuttavia, quando viene eseguito il seguente comando: viene generato

sqlite3 my.db < user.sql 

il seguente errore:

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

Preferirei mantenere l'SQL così com'è, dato che il file verrà controllato nel controllo del codice sorgente e sarà più manutenibile e leggibile come lo è ora. L'SQL può estendersi su più righe come questa, o devo mettere tutto sulla stessa linea?

+0

quando si è tentato di esso, cosa è successo? Hai provato 'sqlite3 mydb.db

+0

Il tuo messaggio di errore non ha molto senso se confrontato con lo snippet di codice che hai fornito. Non c'è ")" sulla linea 1. Puoi fornire il codice effettivo da 'user.sql'? –

+0

Si noti inoltre che alcuni DB non amano gli script che terminano senza (!) Una riga vuota. – KFleischer

risposta

24

Ho avuto esattamente lo stesso problema.

Quindi ho notato che il mio editor (Notepad ++) riporta il formato Macintosh per la fine delle righe.

La conversione di eols in stile Unix ha trasformato il file di script in formato, che sqlite3 ha compreso.

2

Più righe non sono un problema. Potrebbe esserci un problema di piattaforma, perché sono in grado di eseguire correttamente questo esempio utilizzando SQLite3 3.6.22 su OS X 10.5.8.

20

Mi rendo conto che questa non è una risposta diretta alla tua domanda. Come ricorda Brian, questo potrebbe essere un problema stupido della piattaforma.

Se si interfaccia con SQLite attraverso Python, probabilmente evitare maggior parte dei problemi specifici della piattaforma e si arriva ad avere cose divertenti come colonne datetime :-)

Qualcosa del genere dovrebbe funzionare bene:

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

Grazie per il codice utile e sintetico, @bernie. Per gli altri in futuro che si imbattono in questo: se hai più di una dichiarazione nel tuo file SQL, usiamo c.executescript (qry) invece di c.execute (qry) –

+0

Grazie per il tuo commento, Jordan. È probabile che sia utile per i futuri lettori di questo thread. Per aggiungere una nota minore su 'executescript()': [non è una parte standard dell'API DB] (http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript), quindi alcune librerie di database Python potrebbero non essere implementate. – bernie

1

Questo vuole essere esempio di pitone di Bernie aggiornati per gestire le eccezioni nello script, invece di non aver in silenzio (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