SQLite-exécuter un script SQL Multi-ligne à 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 maintenable et lisible comme il est maintenant. Le SQL peut-il couvrir plusieurs lignes comme celle-ci, ou dois-je tout mettre sur la même ligne?

46
demandé sur Justin Ethier 2010-03-04 18:43:42

4 réponses

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

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

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

24
répondu Jan Vlcinsky 2012-02-07 08:03:32

Je me rends compte que ce n'est pas une réponse directe à votre question. Comme le mentionne Brian, cela pourrait être un problème de plate-forme stupide.

Si vous interfacez avec SQLite via Python, vous éviterez probablement la plupart des problèmes spécifiques à la plate-forme et vous aurez des choses amusantes comme les colonnes datetime: -)

Quelque chose comme ça devrait fonctionner correctement:

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()
24
répondu bernie 2010-03-04 16:03:34

Plusieurs lignes ne sont pas un problème. Il peut y avoir 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.

2
répondu Brian Wisti 2010-03-04 16:01:45

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
1
répondu Dirk Bester 2012-08-05 00:19:57