Charger un fichier CSV
Installer le connecteur C - MariaDB
adminX@serveurWebX:~$ su - root Mot de passe : root@serveurWebX:~# apt install libmariadbd-dev
Exemple de fichier CSV
root@serveurWebX:~# cat /tmp/test.csv 2;table jaune;30.1;1 3;chaise jaune;20.5;1
Donner le doit de charger un fichier à un utilisateur MariaDB
- Se connecter :
root@serveurWebX:~# mysql -u root -p Enter password:
- Visiualiser les droits précédent :
MariaDB [(none)]> SHOW GRANTS FOR 'adminBaseMeuble1'@'localhost'; +-------------------------------------------------------------------------------------------------------------------------+ | Grants for adminBaseMeuble1@localhost | +-------------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `adminBaseMeuble1`@`localhost` IDENTIFIED BY PASSWORD '*BD885142404C127AC29793EE3FBB1FDB01D2B25F' | | GRANT SELECT, INSERT, UPDATE, DELETE ON `meubleFournisseur`.* TO `adminBaseMeuble1`@`localhost` | +-------------------------------------------------------------------------------------------------------------------------+
- Donner les droits à l'utilisateur
adminBaseMeuble1:
MariaDB [(none)]> GRANT FILE ON *.* TO 'adminBaseMeuble1'@'localhost';
- Visualiser les droits après :
MariaDB [(none)]> SHOW GRANTS FOR 'adminBaseMeuble1'@'localhost'; +------------------------------------------------------------------------------------------------------------------------+ | Grants for adminBaseMeuble1@localhost | +------------------------------------------------------------------------------------------------------------------------+ | GRANT FILE ON *.* TO `adminBaseMeuble1`@`localhost` IDENTIFIED BY PASSWORD '*BD885142404C127AC29793EE3FBB1FDB01D2B25F' | | GRANT SELECT, INSERT, UPDATE, DELETE ON `meubleFournisseur`.* TO `adminBaseMeuble1`@`localhost` | +------------------------------------------------------------------------------------------------------------------------+ MariaDB [(none)]> exit Bye
Charger le fichier CSV dans la table meubleFournisseur avec une requête SQL
- Se connecter à la base de données
meubleFournisseuravec l'utilisateuradminBaseMeuble1:
root@serveurWebX:~# mysql -u adminBaseMeuble1 -p meubleFournisseur MariaDB [meubleFournisseur]>
- Charger le fichier CSV dans la table
meuble:
MariaDB [(none)]> LOAD DATA INFILE '/tmp/test.csv' INTO TABLE meubleFournisseur.meuble FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' (meu_id, meu_designation, meu_prix, meu_fouId);
- Visualiser les données de la table
meuble:
MariaDB [meubleFournisseur]> SELECT * FROM meuble; +--------+-----------------+----------+-----------+ | meu_id | meu_designation | meu_prix | meu_fouId | +--------+-----------------+----------+-----------+ | 2 | table jaune | 30.10 | 1 | | 3 | chaise jaune | 20.50 | 1 | | 123 | chaise verte | 40.10 | 1 | | 456 | chaise bleue | 40.90 | 1 | | 4401 | chaise rouge | 50.10 | 2 | | 5003 | table verte | 500.00 | 3 | +--------+-----------------+----------+-----------+ MariaDB [meubleFournisseur]> exit
Charger le fichier CSV dans la table meubleFournisseur en langage C
- Pour les tests supprimer tous les enregistrement de la table
adminX@serveurWebX:~$ mysql -u adminBaseMeuble1 -p meubleFournisseur MariaDB [meubleFournisseur]> DELETE FROM meuble; MariaDB [meubleFournisseur]> SELECT * FROM meuble; MariaDB [meubleFournisseur]> exit
- Créer le fichier
chargerCSV.c:
/** * @file loadEnCMysql.c * @brief * compilation: gcc -o loadEnCMysql loadEnCMysql.c `mariadb_config --cflags --libs` * exécution : ./loadEnCMysql -u-p * Ce programme insère des données dans la table fournisseur de la base de données meubleFournisseur. * Il utilise les fonctions de la bibliothèque MySQL C API pour se connecter à la base de données, */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <mysql.h> #define HOTE "localhost" #define NOM_BASE "meubleFournisseur" /* Fonction pour afficher l'usage du programme */ void usage(const char *prog_name) { fprintf(stderr, "Usage: %s -u <user> -p <password> \n", prog_name); exit(1); } int main(int argc, char *argv[]) { MYSQL *pMysql; MYSQL_STMT *stmt; MYSQL_BIND param[2]; const char *sql = "LOAD DATA INFILE '/tmp/test.csv' INTO TABLE meubleFournisseur.meuble FIELDS TERMINATED BY ';' LINES TERMINATED BY '\\n' (meu_id, meu_designation, meu_prix, meu_fouId);"; char *user = NULL, *password = NULL; int opt; // Analyser les arguments avec getopt while ((opt = getopt(argc, argv, "u:p:")) != -1) { switch (opt) { case 'u': user = optarg; // Utilisateur de la base de données break; case 'p': password = optarg; // Mot de passe break; default: usage(argv[0]); // Afficher l'usage si un argument invalide est passé } } // Vérifier que tous les arguments nécessaires sont fournis if (user == NULL || password == NULL ) { usage(argv[0]); } /* Initialiser la structure MySQL */ if ((pMysql = mysql_init(NULL)) == NULL) { fprintf(stderr, "mysql_init() échoué : %s\n", mysql_error(pMysql)); return -1; } /* Se connecter à la base de données */ if (mysql_real_connect(pMysql, HOTE, user, password, NOM_BASE, 0, NULL, 0) == NULL) { fprintf(stderr, "mysql_real_connect() échoué : %s\n", mysql_error(pMysql)); mysql_close(pMysql); return -1; } /* Préparer la requête SQL */ stmt = mysql_stmt_init(pMysql); if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) { fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_error(pMysql)); mysql_close(pMysql); return -1; } /* Exécuter la requête */ if (mysql_stmt_execute(stmt) != 0) { fprintf(stderr, "mysql_stmt_execute() échoué : %s\n", mysql_error(pMysql)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } /* Fermer la requête préparée et la connexion à la base */ mysql_stmt_close(stmt); mysql_close(pMysql); printf("Chargement réussie dans la base de données.\n"); return 0; }
- Compiler le programme :
adminX@serveurWebX:~$ adminX@serveurWebX:~$ gcc -o loadEnCMysql loadEnCMysql.c `mariadb_config --cflags --libs`
- Exécuter le programme :
adminX@serveurWebX:~$ ./loadEnCMysql -u adminBaseMeuble1 -p bonjour Chargement réussie dans la base de données.
- Visualiser les données de la table
meuble:
adminX@serveurWebX:~$ mysql -u adminBaseMeuble1 -p meubleFournisseur MariaDB [meubleFournisseur]> SELECT * FROM meuble; +--------+-----------------+----------+-----------+ | meu_id | meu_designation | meu_prix | meu_fouId | +--------+-----------------+----------+-----------+ | 2 | table jaune | 30.10 | 1 | | 3 | chaise jaune | 20.50 | 1 | +--------+-----------------+----------+-----------+ MariaDB [meubleFournisseur]> exit
Charger le fichier CSV dans la table meubleFournisseur avec une requête SQL sur un serveur distant
Sur le serveur distant hébergeant la base de données
Autoziser l'accès distant à la base de données
- Documentation : Accès depuis un hôte distant
Remarque : modifiez si besoin l'adresse IP et le nom d'utilisateur.
Dans l'exemple ci-après le serveur à pir adresse IP 192.168.56.51 et
la machine client à pour adresse IP 192.168.56.11.
Créez un utilisateur distant avec une clé RSA pour le téléchargement du fichier .csv
Créez l'utilisateur
adminX@serveurWebX:~$ su - root root@serveurWebX:~# useradd -m -s /bin/bash x2 root@serveurWebX:~# passwd x2
Créer de la clé RSA
- Se connecter sur la machine hébergeant le serveur Web à l'aide de l'utilisateur
x2créé précédemment
C:\Users\johnDoe>ssh x2@192.168.56.51
- Créer une clé sans mot de passe
x2@serveurWebX:~$ ssh-keygen -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/home/x2/.ssh/id_rsa): Created directory '/home/x2/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/x2/.ssh/id_rsa Your public key has been saved in /home/x2/.ssh/id_rsa.pub The key fingerprint is: SHA256:HDdcmz5kqXMtnuntVd4VLUAJi5kJAFwmdJ9gDDn7ugw x2@serveurWebX The key's randomart image is: +---[RSA 4096]----+ | o=*B.. .o+. | | +=.o o * o.= .| | o o * = * ...| | . . o * . ..| | . S o = . o| | . + = .+| |E . + +| | o. . . . | | o. ..o | +----[SHA256]-----+
- Renommer la clé publique
x2@serveurWebX:~$ mv .ssh/id_rsa.pub .ssh/authorized_keys
Sur la machine contenant le fichier .csv
Télécharger la clé privée
Remaque l'utilisateur local se nomme x et
l'utilisateur distant se nomme x2. Modifiez si besoin les noms d'utilisateur et l'adresse
IP.
scp x2@192.168.56.11:/home/x/.ssh/id_rsa ~/.ssh/
Modifier le programme
Remarque le fichier se nomme test.csv> et doit
être présent dans le répertoire /tmp
/** * @file loadEnCMysqlDistance.c * @brief * compilation: gcc -o loadEnCMysqlDistance loadEnCMysqlDistance.c `mariadb_config --cflags --libs` * exécution : ./loadEnCMysqlDistance -u-p * Ce programme insère des données dans la table fournisseur de la base de données meubleFournisseur. * Il utilise les fonctions de la bibliothèque MySQL C API pour se connecter à la base de données, */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <mysql.h> #define HOTE "192.168.56.51" #define NOM_BASE "meubleFournisseur" /* Fonction pour afficher l'usage du programme */ void usage(const char *prog_name) { fprintf(stderr, "Usage: %s -u -p \n", prog_name); exit(1); } int main(int argc, char *argv[]) { MYSQL *pMysql; MYSQL_STMT *stmt; MYSQL_BIND param[2]; const char *sql = "LOAD DATA INFILE '/tmp/test.csv' INTO TABLE meubleFournisseur.meuble FIELDS TERMINATED BY ';' LINES TERMINATED BY '\\n' (meu_designation, meu_prix, meu_fouId);"; char *user = NULL, *password = NULL; int opt; // Analyser les arguments avec getopt while ((opt = getopt(argc, argv, "u:p:")) != -1) { switch (opt) { case 'u': user = optarg; // Utilisateur de la base de données break; case 'p': password = optarg; // Mot de passe break; default: usage(argv[0]); // Afficher l'usage si un argument invalide est passé } } // Vérifier que tous les arguments nécessaires sont fournis if (user == NULL || password == NULL ) { usage(argv[0]); } /* Initialiser la structure MySQL */ if ((pMysql = mysql_init(NULL)) == NULL) { fprintf(stderr, "mysql_init() échoué : %s\n", mysql_error(pMysql)); return -1; } /* Se connecter à la base de données */ if (mysql_real_connect(pMysql, HOTE, user, password, NOM_BASE, 0, NULL, 0) == NULL) { fprintf(stderr, "mysql_real_connect() échoué : %s\n", mysql_error(pMysql)); mysql_close(pMysql); return -1; } /* Préparer la requête SQL */ stmt = mysql_stmt_init(pMysql); if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) { fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_error(pMysql)); mysql_close(pMysql); return -1; } system("scp /tmp/test.csv x2@192.168.56.51:/tmp/"); /* Exécuter la requête */ if (mysql_stmt_execute(stmt) != 0) { fprintf(stderr, "mysql_stmt_execute() échoué : %s\n", mysql_error(pMysql)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } /* Fermer la requête préparée et la connexion à la base */ mysql_stmt_close(stmt); mysql_close(pMysql); printf("Chargement réussie dans la base de données.\n"); return 0; }
Compiler le programme
x@serveurX:~$ gcc -o loadEnCMysqlDistance loadEnCMysqlDistance.c `mariadb_config --cflags --libs`
Exécuter le programme
x@serveurX:~$ ./loadEnCMysqlDistance -u adminBaseMeuble2 -p bonjour test.csv 100% 43 22.1KB/s 00:00 Chargement réussie dans la base de données.