web-dev-qa-db-fra.com

Scripting SQLite avec les commandes dot

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.

9
StudentsTea

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.

Première méthode:

sqlite3 database.db < commands.txt

Deuxième méthode:

#!/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
8
StudentsTea

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 .commandset 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.

2
joanolo

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:

  • Pas besoin de fichier supplémentaire.
  • Pas besoin de la syntaxe du document <<"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:

  • Cela utilise la substitution de processus Bash <(…) pour fournir une entrée de fichier sans avoir besoin d'un fichier sur le disque.
  • Le séparateur entre les commandes point est une nouvelle ligne juste avant la commande, que nous générons ici avec echo -e "\n".
0
tanius