2010-03-04 95 views
46

tengo el siguiente código SQL en un archivo, user.sql:SQLite - Ejecuta el script SQL de varias líneas desde el archivo?

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

Sin embargo, cuando se ejecuta el comando siguiente: se genera

sqlite3 my.db < user.sql 

el siguiente error:

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

Preferiría mantener el SQL tal como está, ya que el archivo se controlará en el control de fuente y será más fácil de mantener y leer como lo es ahora. ¿Puede el SQL abarcar varias líneas como esta, o debo poner todo en la misma línea?

+0

Cuando has probado, ¿qué pasó? ¿Intentó 'sqlite3 mydb.db

+0

Su mensaje de error no tiene mucho sentido en comparación con el fragmento de código que proporcionó. No hay ")" en la línea 1. ¿Puedes proporcionar el código real de 'user.sql'? –

+0

También tenga en cuenta que a algunos DB no les gustan los scripts que terminan sin (!) Una línea vacía. – KFleischer

Respuesta

24

Tuve exactamente el mismo problema.

Luego noté que mi editor (Notepad ++) informa el formato de Macintosh para el final de las líneas.

La conversión de eols en estilo Unix convirtió el archivo de script en formato, que sqlite3 entendió.

2

Las líneas múltiples no son un problema. Puede haber un problema de plataforma, porque puedo ejecutar este ejemplo con éxito utilizando SQLite3 3.6.22 en OS X 10.5.8.

20

Me doy cuenta de que esta no es una respuesta directa a su pregunta. Como Brian menciona, esto podría ser un problema de plataforma tonto.

Si la interfaz con SQLite a través de Python, es probable que evitar la mayoría de las cuestiones específicas de la plataforma y se llega a tener cosas divertidas, como las columnas de fecha y hora :-)

Algo como esto debería funcionar bien:

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

Gracias por el útil y sucinto código, @bernie. Para otros en el futuro que se encuentran con esto: si tiene más de una declaración en su archivo SQL, us c.executescript (qry) en lugar de c.execute (qry) –

+0

Gracias por su comentario, Jordan. Es probable que sea útil para los lectores futuros de este hilo. Para agregar una nota menor sobre 'executescript()': [no es una parte estándar de la DB-API] (http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript), entonces algunas bibliotecas de base de datos de Python pueden no implementarlo. – bernie

1

Aquí se pitón ejemplo de Bernie pasaron a controlar las excepciones en la secuencia de comandos en lugar de silencio en su defecto (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 
Cuestiones relacionadas