Elastix(fop2) export sqlite3 vers mysql

Objectif :

Script qui permet d’exporter tous les contact de FOP2 (sqlite3) vers une table mysql « contact » identique.

Table mysql

– Créer une base de donnée && un utilisateur qui va bien

 

CREATE DATABASE `contact` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'contact'@'localhost' IDENTIFIED BY 'password';

GRANT USAGE ON `contact`.* TO 'contact'@'localhost' IDENTIFIED BY 'password' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `contact` . * TO 'contact'@'localhost';


– créer une table contact

CREATE TABLE contact (
id integer primary key auto_increment ,
 name varchar(35),
 last_name varchar(35),
 telefono varchar(12),
 extension varchar(7),
 email varchar(30),
 iduser int,
 picture varchar(50),
 address varchar(100),
 company varchar(30),
 notes varchar(200),
 status varchar(30)
 );


Script

Dans ledossier /var/www/replicationContact créer un fichier export.sh

Pour info j’ai du utiliser le mot de passe root car dans le script ce user ne fonctionnait pas….

#!/bin/sh
date=`date "+%F-%H%M%S"`
localDir=/var/www/replicationContact
dbDir=/var/www/db
dbLogin=contact
dbPswd='password'
#suppression du csv
rm $localDir/transfert.csv
#export sqlite3 en csv
sqlite3 /var/www/db/address_book.db <<!
 .mode csv
 .output /var/www/replicationContact/transfert.csv
 select * from contact;
 .exit
 !
#import du csv dans mysql
mysql --user=$dbLogin --password=$dbPswd --database=contact --execute="TRUNCATE TABLE contact.contact; LOAD DATA INFILE '/var/www/replicationContact/transfert.csv' INTO TABLE contact.contact FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'";

Cron

Penser à  faire un cron qui excute export.sh tous les jours.

Vérifier les droits sur le dossier replicationContact et export:

 chmod 777 replicationContact
 chmod 644 export.sh
nano /etc/crontab
10 1 * * * root /bin/sh /var/www/replicationContact/export.sh

Astuce pour tester la mise en place on peut lancer le cron toutes les minutes :

*/1 * * * * root /bin/sh /var/www/replicationContact/export.sh

Mysql : convertir un select en csv

Actuce

Cette astuce permet de générer un fichier csv directement à  partir d’une requête mysql.

SELECT champ1, champ3, champ6, champ7 FROM matable INTO OUTFILE '/var/www/replication/transfert.csv' FIELDS ESCAPED BY '' TERMINATED BY ';';

Petit bémol les champs vide sont remplacé par NULL systématiquement.

Perso j’utilise généralement cette astuce dans des bash donc derrière je fais un rechercher/remplacer pour virer les NULL du type :

#conversion des champs NULL en espace
sed -i 's/NULL/ /g'  /var/www/replication/transfert.csv

Export mysql vers sqlite3 en shell

Ce tuto permet d’exporter certain champs d’une table mysql et de les importer dans une table sqlite3.

Prérequis :

  • Un dossier /var/www/replication/ qui contiendra nos scripts.
  • Un dossier /var/www/db/ qui contient les base de données sqlite dont address_book.db qui nous intéresse.
  • Une base de donnée mysql avec une table dont on veut exporter des champs

Le dossier replication contiendra 3 fichiers :

  • replication.sh : le bash que l’on exécutera
  • importer.sql : qui contient les actions sqlite3
  • transfert.csv : généré dynamiquement pour le transfert

replication.sh

#!/bin/sh
#definition des variables
date=`date "+%F-%H%M%S"`
localDir=/var/www/replication
dbDir=/var/www/db
dbLogin=monlogin
dbPswd=monpasswordmysql

#suppression du csv
rm $localDir/transfert.csv
#export mysql en csv
mysql --user=$dbLogin --pass=$dbPswd --database=nombase --execute="select champ1, champ3, champ6, champ7 from matable INTO OUTFILE '/var/www/replication/transfert.csv' FIELDS ESCAPED BY '' TERMINATED BY ';';"

#conversion des champs NULL en espace
sed -i 's/NULL/ /g' $localDir/transfert.csv

#import du csv dans sqlite3
sqlite3 $dbDir/address_book.db ".read "$localDir"/importer.sql"

exit 0

importer.sql

DELETE FROM contact;
.mod csv
.separator ;
.import /var/www/replication/transfert.csv contact

transfert.csv

Il contiendra des données au format csv.

SQL CAST: comparer des colonnes de type différents

En SQL pour comparer par exemple des nombres qui sont stockés dans des colonnes de type vachar, vous risquez d’avoir des problème (surtout avec MS SQL). Une astuce :

CAST (matable AS type_à _utiliser_pour_comparer)

Exemple de type :

  • real
  • int
  • decimal(9,7)
  • float

ex :  soit les colonnes TarifA et TarifB

SELECT * FROM matable WHERE (CAST(TarifA AS real) - CAST(TarifB AS real))> 0;

Perso pour comparer des nombre je prends le type real pour tous.