Ruby Accès aux bases de données - Tutoriel DBI

Ce chapitre expliquera comment utiliser Ruby pour accéder aux bases de données.Ruby DBILe module fournit aux scripts Ruby une interface indépendante de la base de données, similaire au module Perl DBI.

DBI signifie Database Independent Interface, représentant l'interface indépendante de la base de données de Ruby. DBI fournit une couche d'abstraction entre le code Ruby et la base de données sous-jacente, vous permettant de changer facilement de base de données. Il définit une série de méthodes, de variables et de spécifications, fournissant une interface de base de données cohérente et indépendante de la base de données.

DBI peut interagir avec les éléments suivants :

  • ADO (ActiveX Data Objects)
  • DB2
  • Frontbase
  • mSQL
  • MySQL
  • ODBC
  • Oracle
  • OCI8 (Oracle)
  • PostgreSQL
  • Proxy/Serveur
  • SQLite
  • SQLRelay

Architecture d'application DBI

DBI est indépendant de toute base de données disponible en arrière-plan. Que vous utilisiez Oracle, MySQL ou Informix, vous pouvez utiliser DBI. Le diagramme d'architecture suivant l'illustre clairement.

Ruby DBI 架构

Ruby DBI utilise généralement une architecture à deux couches :

  • Couche Interface de base de données (DBI). Cette couche est indépendante de la base de données et fournit une série de méthodes d'accès publiques qui peuvent être utilisées quel que soit le type de serveur de base de données.
  • Couche pilote de base de données (DBD). Cette couche dépend de la base de données ; différents pilotes fournissent l'accès à différents moteurs de base de données. MySQL, PostgreSQL, InterBase, Oracle, etc., utilisent chacun des pilotes différents. Chaque pilote est responsable de l'interprétation des requêtes provenant de la couche DBI et de leur mise en correspondance avec des requêtes adaptées à un type donné de serveur de base de données.

Installation

Si vous souhaitez écrire des scripts Ruby pour accéder à une base de données MySQL, vous devez d'abord installer le module Ruby MySQL.

Installation du paquet de développement MySQL

# Ubuntu sudo apt-get install mysql-client sudo apt-get install libmysqlclient15-dev # Centos yum install mysql-devel

Sur Mac OS, vous devez modifier le fichier ~/.bash_profile ou ~/.profile et ajouter le code suivant :

MYSQL=/usr/local/mysql/bin export PATH=$PATH:$MYSQL export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

Ou utilisez un lien symbolique :

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

Installation de DBI avec RubyGems (Recommandée)

RubyGems a été créé vers novembre 2003 et fait partie de la bibliothèque standard de Ruby depuis Ruby 1.9. Pour plus de détails, vous pouvez consulter :Ruby RubyGems

Utilisez gem pour installer dbi et dbd-mysql :

sudo gem install dbi sudo gem install mysql sudo gem install dbd-mysql

Installation à partir des sources (Utilisez cette méthode pour les versions de Ruby antérieures à 1.9)

Ce module est un DBD, et peut êtrehttp://tmtm.org/downloads/mysql/ruby/téléchargé depuis.

Après avoir téléchargé le dernier paquet, extrayez-le et entrez dans le répertoire, puis exécutez les commandes suivantes pour installer :

ruby extconf.rbOuruby extconf.rb --with-mysql-dir=/usr/local/mysqlOuruby extconf.rb --avec-mysql-config

Compilez ensuite :

make

Obtenir et installer Ruby/DBI

Vous pouvez télécharger et installer le module Ruby DBI à partir du lien ci-dessous :

https://github.com/erikh/ruby-dbi

Avant de commencer l'installation, assurez-vous de disposer des privilèges root. Maintenant, suivez les étapes ci-dessous pour installer :

Étape 1

git clone https://github.com/erikh/ruby-dbi.git

Ou téléchargez directement le paquet zip et extrayez-le.

Étape 2

Entrez dans le répertoireruby-dbi-masteret dans le répertoire, utilisez le scriptsetup.rbpour configurer. La commande de configuration la plus courante est 'config' sans paramètres. Cette commande installe tous les pilotes par défaut.

ruby setup.rb config

Plus précisément, vous pouvez utiliser l'option --with pour lister les parties spécifiques que vous souhaitez utiliser. Par exemple, si vous souhaitez uniquement configurer le module DBI principal et le pilote de couche MySQL DBD, saisissez la commande suivante :

ruby setup.rb config --with=dbi,dbd_mysql

Étape 3

La dernière étape consiste à compiler les pilotes et à les installer à l'aide de la commande suivante :

ruby setup.rb setup ruby setup.rb install

Connexion à la base de données

En supposant que nous utilisons une base de données MySQL, avant de vous connecter à la base de données, assurez-vous que :

  • Vous avez créé une base de données TESTDB.
  • Vous avez créé la table EMPLOYEE dans TESTDB.
  • La table possède les champs FIRST_NAME, LAST_NAME, AGE, SEX et INCOME.
  • Définissez l'identifiant utilisateur "testuser" et le mot de passe "test123" pour accéder à TESTDB.
  • Le module Ruby DBI a été correctement installé sur votre machine.
  • Vous avez lu le tutoriel MySQL et comprenez les opérations de base de MySQL.

Voici un exemple de connexion à la base de données MySQL "TESTDB":

Exemple

#!/usr/bin/ruby -w require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") #Obtenir la chaîne de version du serveur et l'afficher row = dbh.select_one("SELECT VERSION()") puts "Version du serveur: " + row[0] rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur: #{e.err}" puts "Message d'erreur: #{e.errstr}" ensure #Se déconnecter du serveur dbh.disconnect if dbh end

Lors de l'exécution de ce script, les résultats suivants seront produits sur une machine Linux.

Server version: 5.0.45

Si la connexion est établie avec une source de données, un handle de base de données est renvoyé et enregistré dansdbhpour une utilisation ultérieure, sinondbhsera défini sur nil,e.errete::errstrrenvoyant respectivement un code d'erreur et une chaîne d'erreur.

Enfin, avant de quitter ce programme, assurez-vous de fermer la connexion à la base de données et de libérer les ressources.

Opération INSERT

Lorsque vous souhaitez créer des enregistrements dans une table de base de données, vous devez utiliser l'opération INSERT.

Une fois la connexion à la base de données établie, nous pouvons nous préparer à utiliser la méthodedoouprepareetexecuteméthode pour créer des tables ou créer des enregistrements à insérer dans les tables de la base de données.

Utilisation de l'instruction do

Les instructions qui ne renvoient pas de lignes peuvent être exécutées en appelant la méthodedode gestion de base de données. Cette méthode prend un paramètre de chaîne d'instruction et renvoie le nombre de lignes affectées par l'instruction.

dbh.do("DROP TABLE IF EXISTS EMPLOYEE") dbh.do("CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )" );

De même, vous pouvez exécuter des instructions SQLINSERTpour créer des enregistrements et les insérer dans la table EMPLOYEE.

Exemple

#!/usr/bin/ruby -w require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)" ) puts "L'enregistrement a été créé" dbh.commit rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur : #{e.err}" puts "Message d'erreur : #{e.errstr}" dbh.rollback ensure #Déconnexion du serveur dbh.disconnect if dbh end

Utilisation deprepareetexecute

Vous pouvez utiliser les méthodes DBIprepareetexecutepour exécuter des instructions SQL dans du code Ruby.

Les étapes pour créer des enregistrements sont les suivantes :

  • Préparez une instruction SQL avec l'instruction INSERT. Cela se fera à l'aide de la méthodeprepare.
  • Exécutez la requête SQL pour sélectionner tous les résultats de la base de données. Cela se fera à l'aide de la méthodeexecute.
  • Libérez le descripteur d'instruction. Cela se fera à l'aide de l'APIfinish.
  • Si tout se passe bien, alorscommitcette opération, sinon vous pouvezrollbackterminer la transaction.

Voici la syntaxe pour utiliser ces deux méthodes :

Exemple

sth = dbh.prepare(statement) sth.execute ... zéro ou plus SQL opérations ... sth.finish

Ces deux méthodes peuvent être utilisées pour passerbinddes valeurs à des instructions SQL. Parfois, les valeurs à saisir peuvent ne pas être fournies à l'avance ; dans ce cas, des valeurs liées sont utilisées. Utilisez un point d'interrogation (?) pour remplacer la valeur réelle, et la valeur réelle est transmise via l'API execute().

L'exemple suivant crée deux enregistrements dans la table EMPLOYEE :

Exemple

#!/usr/bin/ruby -w require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (?, ?, ?, ?, ?)" ) sth.execute('John', 'Poul', 25, 'M', 2300) sth.execute('Zara', 'Ali', 17, 'F', 1000) sth.finish dbh.commit puts "L'enregistrement a été créé" rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur: #{e.err}" puts "Message d'erreur : #{e.errstr}" dbh.rollback ensure #Se déconnecter du serveur dbh.disconnect if dbh end

Si vous utilisez plusieurs INSERT, préparer une seule instruction puis l’exécuter plusieurs fois dans une boucle est bien plus efficace que d’appeler do à chaque passage dans la boucle.

Opération READ

L’opération READ sur n’importe quelle base de données consiste à récupérer des informations utiles depuis la base de données.

Une fois la connexion à la base de données établie, nous pouvons nous préparer à interroger la base de données. Nous pouvons utiliser la méthodedoouprepareetexecuteméthode pour récupérer des valeurs à partir des tables de la base de données.

Les étapes pour récupérer les enregistrements sont les suivantes :

  • En fonction des conditions requises, préparez la requête SQL. Cela se fera en utilisant la méthodeprepare.
  • Exécutez la requête SQL pour sélectionner tous les résultats de la base de données. Cela se fera en utilisant la méthodeexecute.
  • Récupérez les résultats un par un, puis affichez ces résultats. Cela se fera en utilisant la méthodefetch.
  • Libérez le handle de requête. Cela se fera en utilisant la méthodefinish.

L’exemple suivant interroge tous les enregistrements ayant un salaire supérieur à 1000 dans la table EMPLOYEE.

Exemple

#!/usr/bin/ruby -w require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?") sth.execute(1000) sth.fetch do |row| printf "Prénom : %s, Nom : %s\n", row[0], row[1] printf "Âge : %d, Sexe : %s\n", row[2], row[3] printf "Salaire :%d \n\n", row[4] end sth.finish rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur : #{e.err}" puts "Message d'erreur : #{e.errstr}" ensure #Se déconnecter du serveur dbh.disconnect if dbh end

Cela produira le résultat suivant :

First Name: Mac, Last Name : Mohan
Age: 20, Sex : M
Salary :2000

First Name: John, Last Name : Poul
Age: 25, Sex : M
Salary :2300

Il existe de nombreuses autres méthodes pour récupérer des enregistrements depuis la base de données. Si cela vous intéresse, vous pouvez consulterOpération de lecture Ruby DBI。

Opération de mise à jour

L'opération UPDATE sur n'importe quelle base de données consiste à mettre à jour un ou plusieurs enregistrements existants dans la base de données. L'exemple suivant met à jour tous les enregistrements dont SEX vaut 'M'. Ici, nous allons augmenter l'AGE de tous les hommes d'un an. Cela se divise en trois étapes :

  • En fonction des conditions requises, préparez la requête SQL. Cela se fera en utilisant la méthodeprepare.
  • Exécutez la requête SQL pour sélectionner tous les résultats de la base de données. Cela se fera en utilisant la méthodeexecute.
  • Libérez le handle de requête. Cela se fera en utilisant la méthodefinish.
  • Si tout se passe bien, alorscommitl'opération, sinon vous pouvezrollbackterminer la transaction.

Exemple

#!/usr/bin/ruby -w require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?") sth.execute('M') sth.finish dbh.commit rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur : #{e.err}" puts "Message d'erreur : #{e.errstr}" dbh.rollback ensure #Se déconnecter du serveur dbh.disconnect if dbh end

Opération DELETE

Lorsque vous souhaitez supprimer des enregistrements de la base de données, vous devez utiliser l'opération DELETE. L'exemple suivant supprime tous les enregistrements de EMPLOYEE où AGE dépasse 20. Les étapes de cette opération sont les suivantes :

  • En fonction des conditions requises, préparez la requête SQL. Cela se fera en utilisant la méthodeprepare.
  • Exécutez la requête SQL pour supprimer les enregistrements requis de la base de données. Cela se fera en utilisant la méthodeexecute.
  • Libérez le handle de requête. Cela se fera en utilisant la méthodefinish.
  • Si tout se passe bien, alorscommitl'opération, sinon vous pouvezrollbackterminer la transaction.

Exemple

#!/usr/bin/ruby -w require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?") sth.execute(20) sth.finish dbh.commit rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur : #{e.err}" puts "Message d'erreur : #{e.errstr}" dbh.rollback ensure #Se déconnecter du serveur dbh.disconnect if dbh end

Exécution des transactions

Une transaction est un mécanisme qui garantit la cohérence des transactions. Une transaction doit avoir les quatre attributs suivants :

  • Atomicité :L'atomicité d'une transaction signifie que les programmes contenus dans la transaction servent d'unité logique de travail pour la base de données ; les opérations de modification des données qu'ils effectuent sont soit toutes exécutées, soit aucune n'est exécutée.
  • Cohérence :La cohérence d'une transaction signifie que la base de données doit être dans un état cohérent avant et après l'exécution d'une transaction. Si l'état de la base de données satisfait toutes les contraintes d'intégrité, la base de données est dite cohérente.
  • Isolation :L'isolation des transactions signifie que les transactions concurrentes sont isolées les unes des autres, c'est-à-dire que les opérations au sein d'une transaction et les données sur lesquelles elles opèrent doivent être verrouillées et non visibles aux autres transactions tentant de les modifier.
  • Durabilité :La durabilité d'une transaction signifie que lorsqu'une défaillance du système ou du support se produit, les mises à jour des transactions validées sont garanties de ne pas être perdues. Autrement dit, une fois qu'une transaction est validée, ses modifications des données de la base de données doivent être permanentes et résister à toute défaillance du système de base de données. La durabilité est assurée par la sauvegarde et la récupération de la base de données.

DBI fournit deux méthodes pour effectuer des transactions. L'une est la méthodecommitourollback, utilisée pour valider ou annuler des transactions. L'autre esttransactionméthode, qui peut être utilisée pour implémenter des transactions. Ensuite, présentons ces deux méthodes simples pour implémenter des transactions :

Méthode I

La première méthode utilise la méthodecommitetrollbackde DBI pour valider ou annuler explicitement une transaction :

Exemple

dbh['AutoCommit'] = false #Définir auto-commit sur false. begin dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'") dbh.commit rescue puts "transaction failed" dbh.rollback end dbh['AutoCommit'] = vrai

Méthode II

La deuxième méthode utilise la méthodetransaction. Cette méthode est relativement plus simple car elle nécessite un bloc de code qui contient les instructions qui composent la transaction.transactionLa méthode exécute le bloc, puis, selon le succès de l'exécution du bloc, appelle automatiquementcommitourollback:

Exemple

dbh['AutoCommit'] = false #Définir auto-commit à false dbh.transaction do |dbh| dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'") end dbh['AutoCommit'] = true

Opération COMMIT

Commit est une opération qui marque la base de données comme ayant terminé les modifications. Après cette opération, toutes les modifications sont irréversibles.

Voici un exemple simple d'appel de lacommitméthode.

dbh.commit

Opération ROLLBACK

Si vous n'êtes pas satisfait d'une ou plusieurs modifications, et que vous souhaitez annuler complètement ces modifications, alors utilisez larollbackméthode.

Voici un exemple simple d'appel de larollbackméthode.

dbh.rollback

Déconnexion de la base de données

Pour vous déconnecter de la base de données, utilisez l'API disconnect.

dbh.disconnect

Si l'utilisateur ferme la connexion à la base de données via la méthode disconnect, DBI annulera toutes les transactions non terminées. Toutefois, sans dépendre des détails d'implémentation de DBI, votre application peut appeler explicitement et proprement commit ou rollback.

Gestion des erreurs

Il existe de nombreuses sources d'erreurs différentes. Par exemple, des erreurs de syntaxe lors de l'exécution d'instructions SQL, des échecs de connexion, ou l'appel de la méthode fetch sur un handle d'instruction annulé ou terminé.

Si une méthode DBI échoue, DBI lèvera une exception. Les méthodes DBI peuvent lever des exceptions de n'importe quel type, mais les deux classes d'exception les plus importantes sontDBI::InterfaceErroretDBI::DatabaseError。

Les objets d'exception de ces classes possèdenterr、errstretstatetrois attributs, représentant respectivement le numéro d'erreur, une chaîne d'erreur descriptive et un code d'erreur standard. Les attributs sont décrits en détail comme suit :

  • err:Retourne une représentation entière de l'erreur survenue ; si le DBD ne prend pas cela en charge, il retournenil. Par exemple, le DBD Oracle retourneORA-XXXXla partie numérique du message d'erreur.
  • errstr:Retourne une représentation sous forme de chaîne de l'erreur survenue.
  • state:Retourne le code SQLSTATE de l'erreur survenue. SQLSTATE est une chaîne de cinq caractères. La plupart des DBD ne le prennent pas en charge, donc ils retournent nil.

Dans les exemples ci-dessus, vous avez déjà vu le code suivant :

rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur : #{e.err}" puts "Message d'erreur : #{e.errstr}" dbh.rollback ensure #Déconnexion du serveur dbh.disconnect if dbh end

Pour obtenir des informations de débogage sur ce que fait le script pendant l'exécution, vous pouvez activer le traçage. Pour ce faire, vous devez d'abord télécharger le module dbi/trace, puis appeler la méthodetrace:

require "dbi/trace" .............. trace(mode, destination)

La valeur de mode peut être 0 (désactivé), 1, 2 ou 3, et la valeur de destination doit être un objet IO. Les valeurs par défaut sont respectivement 2 et STDERR.

Blocs de code de méthode

Il existe certaines méthodes qui créent des handles. Ces méthodes sont appelées avec un bloc de code. L'avantage d'utiliser des blocs de code avec des méthodes est qu'ils fournissent le handle comme argument au bloc, et le handle est automatiquement nettoyé lorsque le bloc se termine. Voici quelques exemples pour aider à comprendre ce concept.

  • DBI.connect :Cette méthode crée un handle de base de données. Il est recommandé d'appeler à la fin du blocdisconnectpour se déconnecter de la base de données.
  • dbh.prepare :Cette méthode crée un handle d'instruction. Il est recommandé d'appeler à la fin du blocfinish. À l'intérieur du bloc, vous devez appeler la méthodeexecutepour exécuter l'instruction.
  • dbh.execute :Cette méthode est similaire à dbh.prepare, mais avec dbh.execute vous n'avez pas besoin d'appeler la méthode execute à l'intérieur du bloc. Le handle d'instruction est exécuté automatiquement.

Exemple 1

DBI.connectElle peut prendre un bloc de code, lui passer le handle de base de données et déconnecter automatiquement le handle à la fin du bloc.

dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                  "testuser", "test123") do |dbh|

Exemple 2

dbh.prepareElle peut prendre un bloc de code, lui passer le handle d'instruction et appeler automatiquement finish à la fin du bloc.

dbh.prepare("SHOW DATABASES") do |sth| sth.execute puts "Bases de données : " + sth.fetch_all.join(", ") end

Exemple 3

dbh.executeIl peut prendre un bloc de code, lui passer le descripteur d'instruction et appeler automatiquement finish à la fin du bloc.

dbh.execute("SHOW DATABASES") do |sth| puts "Bases de données : " + sth.fetch_all.join(", ") end

DBI transactionLa méthode peut également prendre un bloc de code, comme déjà expliqué dans les chapitres ci-dessus.

Fonctions et attributs spécifiques au pilote

DBI permet aux pilotes de bases de données de fournir des fonctions supplémentaires spécifiques à la base de données, qui peuvent être appelées par l'utilisateur via la méthodefuncde n'importe quel objet Handle.

Utilisez la méthode[]= or []pour définir ou obtenir des attributs spécifiques au pilote.

DBD::Mysql implémente les fonctions spécifiques au pilote suivantes :

Non.Fonction & Description
1dbh.func(:createdb, db_name)
Crée une nouvelle base de données.
2dbh.func(:dropdb, db_name)
Supprime une base de données.
3dbh.func(:reload)
Effectue une opération de rechargement.
4dbh.func(:shutdown)
Arrête le serveur.
5dbh.func(:insert_id) => Fixnum
Renvoie la valeur AUTO_INCREMENT la plus récente pour cette connexion.
6dbh.func(:client_info) => String
Renvoie les informations du client MySQL en fonction de la version.
7dbh.func(:client_version) => Fixnum
Renvoie les informations du client en fonction de la version. Cela est similaire à :client_info, mais renvoie un fixnum au lieu d'une chaîne de caractères.
8dbh.func(:host_info) => String
Renvoie les informations sur l'hôte.
9dbh.func(:proto_info) => Fixnum
Renvoie le protocole utilisé pour la communication.
10dbh.func(:server_info) => String
Renvoie les informations côté serveur MySQL en fonction de la version.
11dbh.func(:stat) => Stringb>
Renvoie l'état actuel de la base de données.
12dbh.func(:thread_id) => Fixnum
Renvoie l'ID du thread actuel.

#!/usr/bin/ruby require "dbi" begin #Se connecter au serveur MySQL dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") puts dbh.func(:client_info) puts dbh.func(:client_version) puts dbh.func(:host_info) puts dbh.func(:proto_info) puts dbh.func(:server_info) puts dbh.func(:thread_id) puts dbh.func(:stat) rescue DBI::DatabaseError => e puts "Une erreur s'est produite" puts "Code d'erreur : #{e.err}" puts "Message d'erreur : #{e.errstr}" ensure dbh.disconnect if dbh end

Cela produira le résultat suivant :

5.0.45
50045
Localhost via UNIX socket
10
5.0.45
150621
Uptime: 384981  Threads: 1  Questions: 1101078  Slow queries: 4 \
Opens: 324  Flush tables: 1  Open tables: 64  \
Queries per second avg: 2.860