Est-il possible d'écrire des scripts contenant des commandes de points SQLite (vis. .read file.sql; .separator ,; .import file.csv;
)?
Je construis et je reconstruis à plusieurs reprises une base de données SQLite et j'ai besoin de taper environ vingt-quatre instructions de commande dot chaque fois que je reconstruis la base de données. Ce serait vraiment bien si je pouvais mettre ces commandes dans un script et les faire lire par SQLite.
Existe-t-il un moyen de placer des commandes dot (pas instructions SQL) dans un script et de les faire exécuter par SQLite?
Je suis sur Mac OS X en utilisant bash.
Hier soir, j'ai cherché une réponse sur Internet et je n'ai rien trouvé. Bien sûr, aujourd'hui, après avoir posté cette question, j'essaie à nouveau -- et je trouve une réponse adéquate presque immédiatement.
L'essentiel? Mettez vos commandes dans un fichier texte et dirigez-le vers SQLite en utilisant le descripteur de fichier d'entrée, ou tout simplement script tout dans un script bash.
sqlite3 database.db < commands.txt
#!/bin/bash --
sqlite3 -batch $1 <<"EOF"
CREATE TABLE log_entry ( <snip> );
.separator "\t"
.import logfile.log log_entry
EOF
Et puis sur la ligne de commande:
import.sh database.db
Comme alternative, que je considère plus simple, vous pouvez simplement utiliser le .read
commande. Depuis la ligne de commande de votre système d'exploitation (terminal sous Mac OS X), saisissez:
sqlite3 yourdatabase.db ".read script_full_of_dot_commands"
Ça va commencer sqlite3
, utilisez la base de données mentionnée, exécutez toutes les commandes dans script_full_of_dot_commands
, et part.
Par exemple, supposons que vous disposez des fichiers suivants:
script_full_of_dot_commands : un fichier contenant à la fois .commands
et SQL commands
:
.read file.sql
.separator ","
.import file.csv t
.headers on
.separator "|"
SELECT name, a FROM t WHERE a < 2 ;
SELECT count(*) FROM t2;
file.sql : Un fichier avec juste des commandes SQL.
DROP TABLE IF EXISTS t;
DROP TABLE IF EXISTS t2;
CREATE TABLE t (a integer PRIMARY KEY, name varchar);
CREATE TABLE t2 (b integer PRIMARY KEY);
file.csv : un fichier de données pour remplir un tableau
1,One
2,Two
3,Three
4,Four
Le résultat de l'exécution
sqlite3 yourdatabase.db ".read script_full_of_dot_commands"
est
name|a
One|1
count(*)
0
Vérifiez également: Exécution d'un script Sqlite3 à partir de la ligne de commande à partir de StackOverflow.
Une autre manière scriptable de fournir des commandes de points SQLite:
sqlite3 db.sqlite < <(echo -e ".read file.sql \n.separator ',' \n.import file.csv")
Vous pouvez également mélanger des commandes SQL. Assurez-vous simplement que la commande echo -e "…"
Imprime les choses comme vous les écririez dans le client de ligne de commande SQLite.
Avantages:
<<"EOF" … EOF
ICI. Cela fonctionne, mais je trouve toujours les commandes Shell multi-lignes compliquées à utiliser lorsque vous copiez et collez dans un terminal.Explications:
<(…)
pour fournir une entrée de fichier sans avoir besoin d'un fichier sur le disque.echo -e "\n"
.