Latest web development tutorials

Доступ к базе данных Руби - 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 общая архитектура использует два слоя:

  • Интерфейс базы данных (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