sqlmig: conversion automatique des fichiers *.csv en *.sql

This commit is contained in:
Jephté Clain 2018-05-06 14:37:05 +04:00
parent 4c43b01739
commit 7bc3af2869
1 changed files with 44 additions and 1 deletions

45
sqlmig
View File

@ -117,7 +117,19 @@ OPTIONS
--force, --continue-on-error
Ne pas s'arrêter en cas d'erreur de mise à jour
--devel
--no-data-csv
Ne pas convertir les fichiers *-data.csv en fichier .sql
correspondant. Cette conversion n'est supportée que pour MySQL pour le
moment, et un fichier de la forme NUMTABLE-data.csv où NUM est une suite
de chiffres est transformé en une suite d'insertions dans la table TABLE
après l'avoir vidée.
La variante NUMTABLE-data_insert.csv ajoute les données dans la table
sans la vider d'abord.
--force-data-csv
Forcer la conversion des fichiers *-data.csv. Par défaut, la conversion
n'est faite que si le fichier csv est plus récent que le fichier sql
correspondant.
--devel-mode
Activer le mode développement. Ce mode est automatiquement activé si
l'utilisateur courant n'est pas root. La suppression des bases de
données n'est autorisée qu'en mode développement
@ -763,6 +775,7 @@ exportdir=
dbdir=
dbname=
force=
data_csv=auto
mode="$MODE"
drop=
drop_only=
@ -791,6 +804,8 @@ args=(
-d:,--databasedir: dbdir=
-n:,--database: dbname=
--force,--continue-on-error force=1
--no-data-csv data_csv=
--force-data-csv data_csv=force
--prod-mode-dangerous mode=prod
--devel-mode mode=devel
-Z,--recreate drop=1
@ -1042,6 +1057,34 @@ for dbdir in "${dbdirs[@]}"; do
ensure_dbtype "$dbdir" "$type"
ensure_dbmode "$dbtype" "$mode"
# Conversion csv --> sql
array_lsfiles csvs "$dbdir" "*.csv"
if [ "$dbtype" == mysql -a -n "$data_csv" ]; then
etitled "Conversion"
for csv in "${csvs[@]}"; do
setx csvname=basename -- "$csv"
sql="${csv%.csv}.sql"
if [ "$data_csv" != force ]; then
testnewer "$csv" "$sql" || continue
fi
estep "$csvname --> ${csvname%.csv}.sql"
eval "$(awk '{
truncate = ($0 ~ /-data_insert(.devel)?.csv$/)? "": "1"
sub(/^.*\//, "")
sub(/^[0-9]+/, "")
sub(/\.csv$/, "")
sub(/\.devel$/, "")
sub(/-data(_[a-z]+*)?$/, "")
print "truncate=" truncate
gsub(/'\''/, "'\'\\\\\'\''")
print "table='\''" $0 "'\''"
}' <<<"$csvname")" #"
"$scriptdir/mysqlloadcsv" >"$sql" ${truncate:+-T} -nIf "$csv" "$table" --prefix "-- -*- coding: utf-8 mode: sql -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8"
done
eend; eclearp
fi
# lister les mises à jour disponibles
drops=()
creates=()