web-dev-qa-db-fra.com

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 maintenable et lisible comme il l'est maintenant. Le SQL peut-il s'étendre sur plusieurs lignes comme celle-ci, ou dois-je tout mettre sur la même ligne?

46
Justin Ethier

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 des eols en style Unix a transformé le fichier de script en format, ce que sqlite3 comprenait.

24
Jan Vlcinsky

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

Si vous vous connectez à 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 bien 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()
27
bernie

Plusieurs lignes ne sont pas un problème. Il peut y avoir un problème de plate-forme, car je peux exécuter cet exemple avec succès en utilisant SQLite3 3.6.22 sur OS X 10.5.8.

2
Brian Wisti

Voici l'exemple de bernie python mis à niveau 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
Dirk Bester