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 --force, --continue-on-error
Ne pas s'arrêter en cas d'erreur de mise à jour 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 Activer le mode développement. Ce mode est automatiquement activé si
l'utilisateur courant n'est pas root. La suppression des bases de l'utilisateur courant n'est pas root. La suppression des bases de
données n'est autorisée qu'en mode développement données n'est autorisée qu'en mode développement
@ -763,6 +775,7 @@ exportdir=
dbdir= dbdir=
dbname= dbname=
force= force=
data_csv=auto
mode="$MODE" mode="$MODE"
drop= drop=
drop_only= drop_only=
@ -791,6 +804,8 @@ args=(
-d:,--databasedir: dbdir= -d:,--databasedir: dbdir=
-n:,--database: dbname= -n:,--database: dbname=
--force,--continue-on-error force=1 --force,--continue-on-error force=1
--no-data-csv data_csv=
--force-data-csv data_csv=force
--prod-mode-dangerous mode=prod --prod-mode-dangerous mode=prod
--devel-mode mode=devel --devel-mode mode=devel
-Z,--recreate drop=1 -Z,--recreate drop=1
@ -1042,6 +1057,34 @@ for dbdir in "${dbdirs[@]}"; do
ensure_dbtype "$dbdir" "$type" ensure_dbtype "$dbdir" "$type"
ensure_dbmode "$dbtype" "$mode" 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 # lister les mises à jour disponibles
drops=() drops=()
creates=() creates=()