46 votes

SQLite - Exécuter un script SQL multiligne à partir d'un fichier ?

J'ai le SQL suivant dans un fichier, user.sql :

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

Cependant, lorsque la commande suivante est exécutée :

sqlite3 my.db < user.sql 

L'erreur suivante est générée :

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

Je préférerais garder le SQL tel quel, car le fichier sera vérifié dans le contrôle de source et sera plus facile à maintenir et à lire tel qu'il est maintenant. Le SQL peut-il s'étendre sur plusieurs lignes comme ceci, ou dois-je tout mettre sur la même ligne ?

27voto

bernie Points 44206

Je réalise que ce n'est pas une réponse directe à votre question. Comme Brian le mentionne, il pourrait s'agir d'un problème de plate-forme stupide.

Si vous vous interfacez avec SQLite par le biais de Python, vous éviterez probablement la plupart des problèmes spécifiques à la plate-forme et vous pourrez avoir des choses amusantes comme les colonnes de temps de date :-)

Quelque chose comme ça devrait fonctionner :

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()

24voto

Jan Vlcinsky Points 7932

J'ai eu exactement le même problème.

Puis j'ai remarqué que mon éditeur (Notepad++) indique le format Macintosh pour la fin des lignes.

La conversion de eols en style Unix a transformé le fichier script en format, que sqlite3 a compris.

2voto

Brian Wisti Points 131

Les lignes multiples ne sont pas un problème. Il peut s'agir d'un problème de plate-forme, car je suis capable d'exécuter cet exemple avec succès en utilisant SQLite3 3.6.22 sur OS X 10.5.8.

1voto

Dirk Bester Points 336

Voici l'exemple python de bernie mis à jour pour gérer les exceptions dans le script au lieu d'échouer silencieusement (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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X