Le meilleur didacticiel Accès à la base Ruby - Tutorial DBI en 2024, dans ce didacticiel, vous pouvez apprendre architecture d'application DBI,installer,Database Connectivity,opération INSERT,Utiliser faire la déclaration,Utilisation deprépareret d'exécuter,opération READ,Mise à jour de l'opération,opération DELETE,Affaires exécutives,procédé I,procédé II,COMMIT opération,opération ROLLBACK,Déconnectez la base de données,Erreur de traitement,méthode des blocs,fonctions et propriétés spécifiques aux pilotes,Exemples,
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:
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:
Si vous voulez écrire des scripts Ruby pour accéder à la base de données MySQL, vous devez installer le module Ruby MySQL.
# 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
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
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
Supposons que nous utilisons la base de données MySQL avant la connexion à la base de données, assurez-vous que:
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.
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.
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
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:
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 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:
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
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:
#!/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
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:
#!/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
Une transaction est un mécanisme pour assurer la cohérence des transactions. Les services devraient avoir les quatre attributs suivants:
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:
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
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 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
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
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.
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:
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.
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 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|
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
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.
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. |
#!/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