Accès à la base Ruby - Tutorial DBI
Ce chapitre vous montrera comment utiliser Ruby pour accéder à la base de données. moduleRuby DBIfournit une interface de base de données indépendante est similaire au module Perl DBI pour les scripts Ruby.
DBI à savoir la base de données d'interface indépendante, au nom de l'interface de base de données indépendante Ruby. DBI entre le code Ruby avec la base de données sous-jacente fournit une couche d'abstraction qui vous permet d'implémenter facilement une commutation de base de données. Il définit un ensemble de méthodes, des variables et des normes, fournit une interface de base de données cohérente base de données indépendante.
DBI peut interagir avec les éléments suivants:
- ADO (ActiveX Data Objects)
- DB2
- Frontbase
- mSQL
- MySQL
- ODBC
- oracle
- OCI8 (Oracle)
- PostgreSQL
- Proxy / Server
- SQLite
- sqlrelay
architecture d'application DBI
DBI indépendante de toute base de données disponible en arrière-plan. Que vous utilisiez Oracle, MySQL, Informix, vous pouvez utiliser le DBI. Le tableau suivant illustre bien ce point.
Ruby DBI architecture générale utilise deux couches:
- Interface de base de données (DBI) de la couche. Cette couche est la base de données indépendante et fournit une série de méthode d'accès du public, en utilisant un serveur de base de données, quel que soit le type d'approche.
- pilote de base de données (DBD) de la couche. Cette couche dépend de la base de données, un autre lecteur donne accès à des moteurs de bases de données différentes. MySQL, PostgreSQL, Interbase, Oracle, respectivement, en utilisant un autre lecteur. Chaque pilote est responsable de l'interprétation des requêtes de la couche DBI, et ces demandes sont mappés à appliquer à une demande d'un type donné de serveur de base de données.
installer
Si vous voulez écrire des scripts Ruby pour accéder à la base de données MySQL, vous devez installer le module Ruby MySQL.
Kit de développement Mysql Installer
# Ubuntu sudo apt-get install mysql-client sudo apt-get install libmysqlclient15-dev # Centos yum install mysql-devel
Mac OS, vous devez modifier ~ / .bash_profile ou fichier ~ / .profile, ajoutez le code suivant:
MYSQL=/usr/local/mysql/bin export PATH=$PATH:$MYSQL export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Ou utiliser la connexion douce:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Utilisez RubyGems installer DBI (recommandé)
RubyGems à propos fondée en Novembre 2003, est devenu une partie de la bibliothèque standard de Ruby Ruby version 1.9. Plus de détails peuvent être consultés: le Ruby RubyGems
Utilisez gem install dbi et dbd-mysql:
sudo gem install dbi sudo gem install mysql sudo gem install dbd-mysql
Installation Utilisez le code (version Ruby moins de 1,9 à utiliser cette méthode)
Le module est un DBD, de http://tmtm.org/downloads/mysql/ruby/ téléchargement.
Après avoir téléchargé le dernier paquet, décompressez dans le répertoire, exécutez la commande suivante pour installer:
% ruby extconf.rb 或者 % ruby extconf.rb --with-mysql-dir=/usr/local/mysql 或者 % ruby extconf.rb --with-mysql-config
Puis compiler:
% make
Obtenir et installer Ruby / DBI
Vous pouvez télécharger et installer le module Ruby DBI à partir du lien suivant:
https://github.com/erikh/ruby-dbi |
Avant de commencer l'installation, assurez-vous d'avoir les privilèges root. Maintenant, installez les étapes suivantes pour installer:
Etape 1
git clone https://github.com/erikh/ruby-dbi.git
Ou directement sous un autre zip et unzip.
Etape 2
Entrez le répertoireruby-dbi-maître,utiliser un script de configurationsetup.rbdans le répertoire. Les commandes de configuration les plus courantes ne sont pas suivies par tous les paramètres paramètre de configuration. La commande de configuration par défaut pour installer tous les pilotes.
$ ruby setup.rb config
Plus précisément, vous pouvez utiliser l'option --with à la liste de la partie spécifique que vous souhaitez utiliser. Par exemple, si vous souhaitez configurer le module principal de DBI et la couche de route MySQL DBD, entrez la commande suivante:
$ ruby setup.rb config --with=dbi,dbd_mysql
Etape 3
La dernière étape consiste à créer le lecteur, utilisez la commande suivante pour installer:
$ ruby setup.rb setup $ ruby setup.rb install
Database Connectivity
Supposons que nous utilisons la base de données MySQL avant la connexion à la base de données, assurez-vous que:
- Vous avez créé un TESTDB de base de données.
- Vous avez créé l'EMPLOYÉ de table dans TESTDB.
- La table avec un champ FIRST_NAME, LAST_NAME, âge, sexe et REVENU.
- Set ID d'utilisateur "testuser" et le mot "test123" pour accéder à TESTDB
- Déjà sur votre machine correctement installé Ruby module DBI.
- Vous avez vu MySQL tutoriel, la compréhension du MySQL d'exploitation sous-jacent.
Les exemples de connexion de base de données MySQL "TESTDB" des suivants sont:
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") # 获取服务器版本字符串,并显示 row = dbh.select_one("SELECT VERSION()") puts "Server version: " + row[0] rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Lorsque vous exécutez ce script, produira les résultats suivants sur une machine Linux.
Server version: 5.0.45
Si vous établissez une connexion avec une source de données, la poignée de base de données retourné (poignée de base de données), et enregistré à laDHP pour une utilisation ultérieure, ou DHPsera fixé à unevaleur nulle,e.err ete :: errstrretourner le code d'erreur et l' erreur chaîne.
Enfin, avant de quitter ce programme, assurez-vous de fermer la connexion de base de données, la libération des ressources.
opération INSERT
Lorsque vous voulez créer un enregistrement dans une table de base de données, vous devez utiliser INSERT.
Une fois la connexion de base de données, nous sommes prêts à créer une table ou d' insérer des données dans la table pour créer une méthode d'enregistrement en utilisant undo ou prépareretexécuterdes méthodes.
Utiliser faire la déclaration
La déclaration ne renvoie pas de lignes en appelantfaire des méthodes de traitement de base de données.Cette méthode prend un paramètre de chaîne de requête et retourne 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écuteruneinstruction SQLINSERTpour créer des enregistrements dans la table EMPLOYEE.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 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 "Record has been created" dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Utilisation deprépareret d'exécuter
Vous pouvez utiliserprépareretexécuterla méthode de DBI pour exécuter Ruby déclarations du code SQL.
Pour créer un enregistrement comme suit:
- instruction SQL préparée avec l'instruction INSERT. Ceci sera accompli grâce à l'utilisation méthodepréparer.
- Exécuter la requête SQL, sélectionnez tous les résultats de la base de données. Ceci sera réalisé en utilisantla méthode d' exécution.
- Relâchez la poignée de déclaration. Ceci sera accompli grâce à l'utilisation de l'API d'arrivée.
- Si tout va bien, l'opération devalidation, ou vous pouvez compléter la restaurationde latransaction.
Voici la syntaxe de ces deux méthodes:
sth = dbh.prepare(statement) sth.execute fr. zero or more SQL operations fr. sth.finish
Les deux méthodes peuvent être utilisées pourlier une valeur à transmettre des instructions SQL.Parfois, la valeur est entrée ne peut être donnée à l'avance, dans ce cas, est utilisé pour lier les valeurs. Utilisez un point d' interrogation(?) Au lieu de la valeur réelle, la valeur réelle de passer à travers l' exécution () API.
L'exemple suivant crée deux enregistrements de la table EMPLOYEE:
#!/usr/bin/ruby -w require "dbi" begin # 连接到 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 "Record has been created" rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Si vous utilisez INSERT multiple, puis d'abord préparer une déclaration, puis exécuter plusieurs fois dans une boucle à travers chaque cycle qu'il appelle faire beaucoup plus efficacement.
opération READ
opération de lecture sur une base de données se réfère à obtenir des informations utiles à partir de la base de données.
Une fois la connexion de base de données, nous sommes prêts à interroger la base de données. Nous pouvons utiliser une méthode oune prépareretexécuterla méthode pour obtenir la valeur d'une table de base de données.
Obtenir étape enregistrée comme suit:
- Sur la base des conditions requises pour la préparation des requêtes SQL. Ceci sera accompli grâce à l'utilisation méthodepréparer.
- Exécuter la requête SQL, sélectionnez tous les résultats de la base de données. Ceci sera réalisé en utilisantla méthode d' exécution.
- Un par un pour obtenir des résultats, et délivre les résultats. Ceci sera accompli par l'utilisation dechercher des méthodes.
- Relâchez la poignée de déclaration. Ceci sera accompli par l'utilisation de procédésde finition.
L'exemple de requête suivant tous les salaires (salaire) a enregistré plus de 1000 de la table EMPLOYEE.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 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 "First Name: %s, Last Name : %s\n", row[0], row[1] printf "Age: %d, Sex : %s\n", row[2], row[3] printf "Salary :%d \n\n", row[4] end sth.finish rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure # 断开与服务器的连接 dbh.disconnect if dbh end
On obtient les résultats suivants:
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 méthodes pour obtenir les enregistrements de la base de données, si vous êtes intéressé, vous pouvez voir Ruby DBI opération de lecture .
Mise à jour de l'opération
Toute opération base de données UPDATE se réfère à une ou plusieurs mises à jour de base de données des enregistrements existants. L'exemple suivant met à jour SEX est 'M' pour tous les enregistrements. Ici, nous allons ajouter une année, tous les mâles AGE. Il sera divisé en trois étapes:
- Sur la base des conditions requises pour la préparation des requêtes SQL. Ceci sera accompli grâce à l'utilisation méthodepréparer.
- Exécuter la requête SQL, sélectionnez tous les résultats de la base de données. Ceci sera réalisé en utilisantla méthode d' exécution.
- Relâchez la poignée de déclaration. Ceci sera accompli par l'utilisation de procédésde finition.
- Si tout va bien, l'opération devalidation, ou vous pouvez compléter la restaurationde latransaction.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 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 "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 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. Les exemples suivants supprimer AGE 20 sur tous les enregistrements de l'employé. Les étapes de fonctionnement sont les suivantes:
- Sur la base des conditions requises pour la préparation des requêtes SQL. Ceci sera accompli grâce à l'utilisation méthodepréparer.
- Exécuter des requêtes SQL, supprimer les enregistrements souhaités à partir de la base de données. Ceci sera réalisé en utilisantla méthode d' exécution.
- Relâchez la poignée de déclaration. Ceci sera accompli par l'utilisation de procédésde finition.
- Si tout va bien, l'opération devalidation, ou vous pouvez compléter la restaurationde latransaction.
#!/usr/bin/ruby -w require "dbi" begin # 连接到 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 "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Affaires exécutives
Une transaction est un mécanisme pour assurer la cohérence des transactions. Les services devraient avoir les quatre attributs suivants:
- Atomicité (atomicité): atomicité de la transaction signifie que le programme est inclus dans la transaction comme une unité logique de base de données de travail, il fait les opérations de modification de données soit toutes exécutées ou non à tous.
- Cohérence (Cohérence): transaction de cohérence se réfère à une transaction exécutée avant et après la mise en œuvre de la base de données doit être dans un état cohérent.Si l'état de la base de données répond à toutes les contraintes d'intégrité, dire la base de données est conforme.
- Isolation (Isolation): isolation de la transaction se réfère aux transactions concurrentes sont isolées les unes des autres, qui est, dans une transaction de données de fonctionnement et d' exploitation sont à étancher, on ne voit pas d' autres tentatives pour modifier la transaction.
- signifie transaction durabilité que lorsqu'un système ou l' échec des médias, a commis des opérations pour assurer que les mises à jour ne peuvent pas êtreperdus: persistants (durabilité).Qu'une fois la transaction est validée, modifiez ses données dans la base de données devrait être permanente, supporter toute défaillance du système de base de données. Persistent garanti par la sauvegarde de base de données et de récupération.
DBI offre deux façons d'effectuer la transaction. On est les méthodesvaliderouannulerpour valider ou annuler la transaction. Il y a également un procédéde transactionpeut être utilisé pour implémenter la transaction. Ensuite, nous introduisons deux méthode simple de mise en œuvre des opérations:
procédé I
La première méthode utilisevalidationet d'annulationdes méthodes de DBI pour commettre ou annuler la transaction explicitement:
dbh['AutoCommit'] = false # 设置自动提交为 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'] = true
procédé II
La deuxième méthode utilise le procédéde transaction.Cette méthode est relativement simple, car elle nécessite une opération constitue un bloc de code déclaration contenant. méthodede transactionexécute le bloc, puis le bloc est exécuté avec succès, invoquer automatiquementcommitourollback:
dbh['AutoCommit'] = false # 设置自动提交为 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
COMMIT opération
Commit est une opération a été achevée afin d'identifier les changements de base de données, et après cette opération, tous les changements ne sont pas récupérables.
Voici un exemple simplecommit invocation de méthode.
dbh.commit
opération ROLLBACK
Si vous n'êtes pas satisfait avec un ou quelques changements, vous voulez restaurer complètement ces changements, utilisez la méthodede restauration.
Voici un exemple simple de la méthoderollback appel.
dbh.rollback
Déconnectez la base de données
Pour vous déconnecter de la base de données, utilisez l'API de déconnexion.
dbh.disconnect
Si l'utilisateur ferme la méthode de déconnexion de connexion de base de données, DBI annule toutes les transactions incomplètes. Cependant, il ne repose pas sur les détails de tout DBI de mise en œuvre, et votre application peut être un bon appel explicite à valider ou annuler.
Erreur de traitement
Il existe de nombreuses sources d'erreur différents. Par exemple, les erreurs de syntaxe dans la mise en œuvre de l'instruction SQL ou la connexion échoue, ou est une déclaration complète ou un appel de poignée annulées méthode de récupération.
Si une méthode DBI échoue, DBI lancera une exception. méthode DBI peut jeter tout type d'exception, mais les deux plus importantes classe d'exception estDBI :: InterfaceErroretDBI :: DatabaseError.
objets d'exception de ces classes sonterr,errstr trois attributs et de l'état,sous-tableau représente le numéro d'erreur, une chaîne d'erreur descriptif et un code d'erreur standard. Attribut spécifié comme suit:
- err: renvoie une erreur d'entier qui a eu lieu la notation, si DBD ne supporte pas le retour dezéro.Par exemple, Oracle DBD Retourne section message d'erreur ORA-XXXX.
- errstr: Renvoie une représentation de chaîne de l'erreur survenue.
- Etat: Retourne le code d'erreur SQLSTATE est survenue.SQLSTATE est une longueur de chaîne de cinq caractères. La plupart des DBD ne le supporte pas, il sera de retour à zéro.
Dans l'exemple ci-dessus, vous avez vu le code suivant:
rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end
Pour obtenir des informations de débogage sur le contenu du script est exécuté lorsque le script est exécuté, vous pouvez activer le traçage. Pour ce faire, vous devez d' abord télécharger le module dbi / trace, et ensuite appeler le suivi de mode de commande et la méthode de sortie destinationde trace:
require "dbi/trace" frfrfrfrfrfrfr trace(mode, destination)
mode de valeur peut être 0 (désactivé), 1,2, ou 3, la valeur de la destination doit être un objet IO. Les valeurs par défaut sont 2 et STDERR.
méthode des blocs
Il existe des moyens pour créer une poignée. Ces méthodes sont invoquées par le bloc de code. Les avantages de l'utilisation de blocs de code avec la méthode est qu'elles fournissent une poignée pour le bloc comme un argument lorsque le bloc est terminé poignée effacée automatiquement. Voici quelques exemples pour aider à comprendre ce concept.
- DBI.connect: Cette méthode génère une poignée de base de données, il est recommandé à la fin de l'appel de blocdéconnexionpour déconnecter la base de données.
- dbh.prepare: Cette méthode génère un descripteur d'instruction, recommande d' appelerarrivéeà la fin du bloc.Dans un bloc, vous devez appeler la méthode d'exécutionpour exécuter l'instruction.
- dbh.execute: Cette méthode est similaire à dbh.prepare, mais dbh.execute pas besoin d'appeler méthode execute dans le bloc.Une poignée de déclaration est automatiquement exécutée.
exemple 1
DBI.connect peut avoir un bloc de code, en lui passant la poignée de base de données, et la poignée se déconnectera automatiquement à la fin du bloc.
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|
exemple 2
dbh.prepare peut avoir un bloc de code, en passant le descripteur d'instruction, et appelle automatiquement arrivée à la fin du bloc.
dbh.prepare("SHOW DATABASES") do |sth| sth.execute puts "Databases: " + sth.fetch_all.join(", ") end
exemple 3
dbh.execute peut avoir un bloc de code, en passant le descripteur d'instruction, et appelle automatiquement arrivée à la fin du bloc.
dbh.execute("SHOW DATABASES") do |sth| puts "Databases: " + sth.fetch_all.join(", ") end
méthode de transactionDBIpeut également être muni d'un bloc de code, qui , dans les sections ci - dessus ont expliqué précédemment.
fonctions et propriétés spécifiques aux pilotes
Laissez pilote de base de données DBI fournit des fonctions supplémentaires base de données spécifique, ces fonctions peuvent être appelées par un objet quelconque méthode de poignée utilisateurfonc.
Utilisez[] = ouméthode[]pour définir ou obtenir des pilotes spécifiques attributs.
DBD :: Mysql implémente la fonction suivante un pilote spécifique:
Non. | Fonction & Description |
---|---|
1 | dbh.func (: createdb, db_name) Créer une nouvelle base de données. |
2 | dbh.func (: dropdb, db_name) Pour supprimer une base de données. |
3 | dbh.func (: reload) Recharger opération. |
4 | dbh.func (: shutdown) Arrêtez le serveur. |
5 | dbh.func (: insert_id) => Fixnum Renvoie la valeur AUTO_INCREMENT récente de la connexion. |
6 | dbh.func (: client_info) => Chaîne Renvoie MySQL informations de version du client au besoin. |
7 | dbh.func (: client_version) => Fixnum Selon les informations de version au client. Ceci est: Similaire à client_info, mais il retournera un fixnum, plutôt que de retourner une chaîne. |
8 | dbh.func (: host_info) => Chaîne Renvoie les informations d'hôte. |
9 | dbh.func (: proto_info) => Fixnum Renvoie les protocoles utilisés pour la communication. |
10 | dbh.func (: server_info) => Chaîne Renvoie les informations de version du serveur MySQL base. |
11 | dbh.func (: stat) => chaineB > Renvoie l'état actuel de la base de données. |
12 | dbh.func (: thread_id) => Fixnum Retourne l'identifiant du thread courant. |
Exemples
#!/usr/bin/ruby require "dbi" begin # 连接到 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 "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure dbh.disconnect if dbh end
On obtient les résultats suivants:
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