Доступ к базе данных Руби - DBI Учебник
В этой главе мы покажем вам, как использовать Ruby, чтобы получить доступ к базе данных. МодульРубин DBIпредоставляет независимым от базы данных интерфейс похож на модуль Perl DBI для скриптов на Ruby.
DBI базы данных, а именно независимый интерфейс, от имени базы данных-независимый интерфейс Ruby. DBI между Ruby-кода с основной базой данных обеспечивает уровень абстракции, что позволяет легко осуществлять переключение базы данных. Он определяет набор методов, переменных и норм, обеспечивает зависящий от баз данных последовательный интерфейс базы данных.
DBI может взаимодействовать со следующими указаниями:
- ADO (ActiveX Data Objects)
- DB2
- Frontbase
- Msql
- MySQL
- ODBC
- оракул
- OCI8 (Oracle)
- PostgreSQL
- Прокси / сервер
- SQLite
- SQLRelay
Архитектура приложения DBI
DBI не зависит от какой-либо базе данных, доступной в фоновом режиме. Если вы используете Oracle, MySQL, Informix, вы можете использовать DBI. Следующая диаграмма наглядно иллюстрирует эту точку зрения.
Рубин DBI общая архитектура использует два слоя:
- Интерфейс базы данных (DBI) слой. Этот слой зависит от базы данных и предоставляет ряд метода общего доступа, используя сервер базы данных, независимо от типа подхода.
- Драйвер базы данных (DBD) слой. Этот слой в зависимости от базы данных, другой привод обеспечивает доступ к различным СУБД. MySQL, PostgreSQL, InterBase, Oracle, соответственно, с использованием другого диска. Каждый водитель несет ответственность за интерпретацию запросов от слоя DBI, и эти запросы отображаются применить к запросу для данного типа сервера баз данных.
устанавливать
Если вы хотите писать скрипты на Ruby, чтобы получить доступ к базе данных MySQL, вам необходимо установить модуль Рубин MySQL.
Установить Kit Mysql Development
# Ubuntu sudo apt-get install mysql-client sudo apt-get install libmysqlclient15-dev # Centos yum install mysql-devel
Mac OS, вам необходимо изменить ~ / .bash_profile или ~ / .profile файл, добавьте следующий код:
MYSQL=/usr/local/mysql/bin export PATH=$PATH:$MYSQL export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Или используйте мягкое соединение:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Используйте RubyGems установить DBI (рекомендуется)
RubyGems о основана в ноябре 2003 года, вошла в состав стандартной библиотеки Ruby, из Ruby 1.9 версии. Подробнее можно посмотреть: Рубин RubyGems
Используйте драгоценный камень установить DBI и DBD-MySQL:
sudo gem install dbi sudo gem install mysql sudo gem install dbd-mysql
Установка использования кода (Ruby версии менее чем 1.9, чтобы использовать этот метод)
Модуль представляет собой DBD, от http://tmtm.org/downloads/mysql/ruby/~~HEAD=pobj загрузки.
После загрузки последнего пакета, распаковать в каталог, выполните следующую команду для установки:
% ruby extconf.rb 或者 % ruby extconf.rb --with-mysql-dir=/usr/local/mysql 或者 % ruby extconf.rb --with-mysql-config
Затем скомпилировать:
% make
Получить и установить Рубин / DBI
Вы можете загрузить и установить модуль DBI Руби по следующей ссылке:
https://github.com/erikh/ruby-dbi |
Перед началом установки убедитесь, что у Вас есть привилегии. Теперь установите следующие действия для установки:
Шаг 1
git clone https://github.com/erikh/ruby-dbi.git
Или непосредственно под другой почтовый и распакуйте.
Шаг 2
Введите каталогрубиново-DBI-мастер,используйтеsetup.rbскрипт конфигурации в каталоге. Наиболее распространенные команды конфигурации не следует каких-либо параметров конфигурации параметров. Команда настройки по умолчанию для установки всех драйверов.
$ ruby setup.rb config
Более конкретно, вы можете использовать опцию --with перечислить определенную часть, которую вы хотите использовать. Например, если вы хотите настроить главный DBI модуль и диск слоя MySQL DBD, введите следующую команду:
$ ruby setup.rb config --with=dbi,dbd_mysql
Шаг 3
Последний шаг заключается в создании диска используйте следующую команду для установки:
$ ruby setup.rb setup $ ruby setup.rb install
Связь с базами данных
Предположим, что мы используем базу данных MySQL перед подключением к базе данных, убедитесь, что:
- Вы создали TESTDB базы данных.
- Вы создали таблицу сотрудников TESTDB.
- Таблица с полем FIRST_NAME, LAST_NAME, возраст, пол и доход.
- Установить идентификатор пользователя "TestUser" и пароль "test123", чтобы получить доступ к TESTDB
- Уже на вашей машине установлен правильно Рубиновый модуль DBI.
- Вы видели MySQL учебник, понимание основной операционной MySQL.
Ниже приведены примеры подключения к базе данных MySQL "TESTDB" из:
#!/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
При запуске этого сценария будет производить следующие результаты на машине Linux.
Server version: 5.0.45
Если установить соединение с источником данных, возвращенного дескриптора базы данных (БД) Ручка и сохраняется вДБГ для последующего использования, или DBHбудет установлен на нулевойстоимости,e.err ие :: ErrStrвозвращает код ошибки и сообщение об ошибке строка.
И, наконец, перед выходом из этой программы, не забудьте закрыть соединение с базой данных, выделение ресурсов.
операции ВСТАВИТЬ
Если вы хотите создать запись в таблице базы данных, вам необходимо использовать операцию вставки.
После подключения к базе данных, мы готовы создать таблицу или вставить данные в таблицу , чтобы создать метод записи с помощьюделать или подготавливатьивыполнятьметоды.
Использование сделать заявление
Оператор не возвращает строки, вызываясделать методы обработки базы данных.Этот метод принимает параметр Строка оператора и возвращает количество строк, затронутых в заявлении.
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 )" );
Кроме того , вы можете выполнить SQLINSERTзаявление для создания записей в таблицу 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
Использованиеподготовитьивыполнить
Вы можете использоватьподготовитьивыполнитьметод DBI для выполнения Ruby - операторы кода SQL.
Чтобы создать запись следующим образом:
- Подготовленный заявление SQL с заявлением INSERT. Это будет достигнуто за счет использования методаподготовки.
- Выполнить SQL запрос, выберите все результаты из базы данных. Это будет достигнуто с помощью методавыполнения.
- Отпустите ручку заявление. Это будет достигнуто за счет использованияфинишной API.
- Если все пойдет хорошо, тосовершить операцию, или вы можете выполнить откат транзакции.
Синтаксис этих двух методов:
sth = dbh.prepare(statement) sth.execute ... zero or more SQL operations ... sth.finish
Оба метода могут быть использованы длясвязывания значения для передачи операторов SQL.Иногда вводится значение не может быть задана заранее, в данном случае, используется для привязки значений. Используйте знак вопроса(?) Вместо фактического значения, фактическое значение , чтобы пройти через Execute () API.
Следующий пример создает две записи в таблице 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
Если вы используете несколько INSERT, то сначала подготовить заявление, а затем выполнить несколько раз в цикле через каждый цикл, чем это требует сделать гораздо более эффективно.
операция чтения
ПРОЧТИТЕ операция по любой базе данных относится получить полезную информацию из базы данных.
После подключения к базе данных, мы готовы запросить базу данных. Мы можем использовать метод илиже подготовитьивыполнитьметод , чтобы получить значение из таблицы базы данных.
Получить шаг записывается следующим образом:
- На основании условий, необходимых для подготовки запросов SQL. Это будет достигнуто за счет использования методаподготовки.
- Выполнить SQL запрос, выберите все результаты из базы данных. Это будет достигнуто с помощью методавыполнения.
- Один за другим, чтобы получить результаты, и выводит результаты. Это будет достигнуто за счет использования методоввыборки.
- Отпустите ручку заявление. Это будет достигнуто за счет использования методовотделки.
Следующий пример запроса все заработной платы (оклада) было зарегистрировано более 1000 из таблицы 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
Это дает следующие результаты:
First Name: Mac, Last Name : Mohan Age: 20, Sex : M Salary :2000 First Name: John, Last Name : Poul Age: 25, Sex : M Salary :2300
Есть много методов для получения записей из базы данных, если вы заинтересованы, вы можете просматривать операции Руби DBI чтения .
Операция обновления
Любая операция обновления базы данных относится к одному или нескольким обновления базы данных существующих записей. Следующий пример обновляет секс является 'M' для всех записей. Здесь, мы добавим в год все мужчины ВОЗРАСТ. Она будет разделена на три этапа:
- На основании условий, необходимых для подготовки запросов SQL. Это будет достигнуто за счет использования методаподготовки.
- Выполнить SQL запрос, выберите все результаты из базы данных. Это будет достигнуто с помощью методавыполнения.
- Отпустите ручку заявление. Это будет достигнуто за счет использования методовотделки.
- Если все пойдет хорошо, тосовершить операцию, или вы можете выполнить откат транзакции.
#!/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
операция удаления
Если вы хотите удалить записи из базы данных, вам необходимо использовать операцию удаления. Следующие примеры удаления в возрасте 20 лет по всем записям из РАБОТНИКА. Шаги операции заключаются в следующем:
- На основании условий, необходимых для подготовки запросов SQL. Это будет достигнуто за счет использования методаподготовки.
- Выполнение запросов SQL, удалите нужные записи из базы данных. Это будет достигнуто с помощью методавыполнения.
- Отпустите ручку заявление. Это будет достигнуто за счет использования методовотделки.
- Если все пойдет хорошо, тосовершить операцию, или вы можете выполнить откат транзакции.
#!/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
Исполнительные делам
Сделка представляет собой механизм для обеспечения согласованности транзакций. Услуги должны иметь следующие четыре признака:
- Атомарность (атомарность): неделимость сделки означает , что программа включена в транзакции в качестве логической единицы работы базы данных, он делает операции изменения данных либо все выполняются или не выполняются вообще.
- Последовательность (Последовательность): Последовательность транзакции относится к транзакции выполняться до и после реализации базы данных должна находиться в согласованном состоянии.Если состояние базы данных удовлетворяет всем ограничениям целостности, говорят, что база данных согласована.
- Изоляция (Isolation): изоляции транзакции относится к параллельных транзакций изолированы друг от друга, то есть в рамках транзакции операционных и эксплуатационных данных должны быть блокированы, он не видел другие попытки изменить транзакцию.
- Стойкие (Прочность): долговечность транзакций означает , что , когда система или СМИ неудачи, совершенные транзакции , чтобы гарантировать , что обновления не могут быть потеряны.То, что когда транзакция фиксируется, изменить свои данные в базе данных должны быть постоянными, терпеть любой сбой системы базы данных. Стойкие гарантировано резервного копирования и восстановления базы данных.
DBI предоставляет два способа выполнения сделки. Одним из них являетсяпринятиеилиоткатметоды для совершения или откат транзакции. Существует также способоплатыможет быть использован для реализации сделки. Далее мы вводим два простых способа реализации сделки:
Метод I
Первый метод использует DBI вфиксациюиоткатметоды явно подтвердить или отменить сделку:
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
Метод II
Второй метод использует методтранзакции.Этот метод является относительно простым, поскольку она требует транзакция представляет собой блок кода, содержащий заявление. способ осуществлениясделкивыполняет блок, а затем блок успешно выполняется, автоматически вызываютфиксациюилиоткат:
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 операцию
Фиксировать операция была завершена для выявления изменений в базе данных, и после этой операции, все изменения не восстанавливаются.
Вот простой примерфиксации вызова метода.
dbh.commit
операция ROLLBACK
Если вы не удовлетворены с одним или несколькими изменениями, вы хотите , чтобы полностью восстановить эти изменения, используйте методотката.
Вот простой примеротката вызова метода.
dbh.rollback
Отключите базу данных
Для отключения от базы данных, используйте API разъединения.
dbh.disconnect
Если пользователь закрывает метод разъединения соединения с базой данных, DBI откат всех незавершенных транзакций. Тем не менее, он не опирается на детали реализации любого DBI, и ваше приложение может быть хорошим явный вызов для совершения или откат.
ошибка при обработке
Есть много различных источников ошибок. Например, синтаксические ошибки в реализации заявления SQL или не удается установить соединение, или полное заявление или аннулированный вызовы ручки выборки метод.
Если метод DBI терпит неудачу, DBI будет сгенерировано исключение. метод DBI может бросить любой тип исключения, но наиболее важный класс два исключениеDBI :: InterfaceErrorиDBI :: DatabaseError.
Исключение объектов этих классовзаблуждаетесь,ErrStr три атрибута исостояния,суб-таблица представляет номер ошибки, описательную строку ошибки и стандартный код ошибки. Атрибут определяется следующим образом:
- ERR: возвращает целое ошибка, возникавшая обозначения, если DBD не поддерживает возвратнолю.Например, Oracle DBD Возвращает раздел ORA-XXXXсообщение об ошибке.
- ErrStr: Возвращает строковое представление ошибки , которая произошла.
- состояние: Возвращает произошла ошибка код SQLSTATE.SQLSTATE состоит из пяти символов длина строки. Большинство ДСД не поддерживает его, то он вернет ноль.
В приведенном выше примере, вы видели следующий код:
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
Чтобы получить информацию об отладке о содержимом сценария выполняется при выполнении сценария, вы можете включить трассировку. Для этого необходимо сначала загрузить модуль DBI / трассировки, а затем вызвать отслеживания режима управления и способ вывода назначениятрассировки:
require "dbi/trace" .............. trace(mode, destination)
Режим Значение может быть 0 (выключено), 1,2, или 3, значение пункта назначения должен быть объектом IO. Значения по умолчанию 2 и STDERR.
метод Блок
Есть способы, чтобы создать ручку. Эти методы вызываются с помощью блока кода. Преимущества использования блоков кода с помощью метода является то, что они обеспечивают ручку для блока в качестве аргумента, когда блок завершается автоматически очищаться ручку. Вот несколько примеров, чтобы помочь понять эту концепцию.
- DBI.connect: Этот метод генерирует дескриптор базы данных, рекомендуется в концеразъединениявызова блока , чтобы отсоединить базу данных.
- dbh.prepare: Этот метод генерирует дескриптор инструкции, рекомендует вызовазакончитьв конце блока.В блоке, вы должны вызвать методвыполнениядля выполнения оператора.
- dbh.execute: Этот метод похож на dbh.prepare, но dbh.execute не нужно вызывать метод выполнения в пределах блока.Заявление ручка автоматически выполняется.
Пример 1
DBI.connect может иметь блок кода, передавая ему дескриптор базы данных, а ручка автоматически отключится в конце блока.
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|
Пример 2
dbh.prepare может иметь блок кода, передавая дескриптор, и автоматически вызывает закончить в конце блока.
dbh.prepare("SHOW DATABASES") do |sth| sth.execute puts "Databases: " + sth.fetch_all.join(", ") end
Пример 3
dbh.execute может иметь блок кода, передавая дескриптор, и автоматически вызывает закончить в конце блока.
dbh.execute("SHOW DATABASES") do |sth| puts "Databases: " + sth.fetch_all.join(", ") end
Детали сделкиDBIтакже может быть снабжен блоком кода, который был показан выше уже было объяснено выше.
От драйвера функции и свойства
Пусть драйвер базы данных DBI предоставляет дополнительные функции определенную базу данных, эти функции могут быть вызваны любым пользователемFuncобъекта метод Handle.
Используйте[] = или []способ установить или получить атрибуты специальные драйверы.
DBD :: Mysql реализует функцию следующий специальный драйвер:
Нет. | Функция & Описание |
---|---|
1 | dbh.func (: CREATEDB, db_name) Создать новую базу данных. |
2 | dbh.func (: dropdb, db_name) Чтобы удалить базу данных. |
3 | dbh.func (: перезарядка) Обновить операцию. |
4 | dbh.func (: выключение) Выключите сервер. |
5 | dbh.func (: insert_id) => Fixnum Возвращает последнее значение AUTO_INCREMENT соединения. |
6 | dbh.func (: client_info) => Строка Возвращает информацию о версии клиента для MySQL по мере необходимости. |
7 | dbh.func (: client_version) => Fixnum В зависимости от информации о версии обратно клиенту. Это: Подобно client_info, но он будет возвращать Fixnum, а не возвращать строку. |
8 | dbh.func (: host_info) => Строка Возвращает информацию о хосте. |
9 | dbh.func (: proto_info) => Fixnum Возвращает протоколы, используемые для обмена данными. |
10 | dbh.func (: server_info) => Строка Возвращает информацию о версии сервера MySQL на основе. |
11 | dbh.func (: стат) => Stringb > Возвращает текущее состояние базы данных. |
12 | dbh.func (: thread_id) => Fixnum Возвращает текущий идентификатор потока. |
примеров
#!/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
Это дает следующие результаты:
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