Главная Обратная связь

Дисциплины:






Подключение к внешним базам данных



Благодаря усилиям многих людей Ruby может взаимодействовать с разными базами данных, от монолитных систем типа Oracle до более скромного MySQL. Для полноты описания мы включили в него также текстовые файлы в формате CSV.

Уровень функциональности, реализованный в этих пакетах, постоянно изменяется. Обязательно познакомьтесь с последней версией документации в сети. Неплохой отправной точкой станет архив приложений Ruby.

Интерфейс с SQLite

SQLite — популярная база данных для тех, кто ценит программное обеспечение, которое не нужно конфигурировать. Это небольшая автономная исполняемая программа, написанная на языке С, которая хранит всю базу данных в одном файле. Хотя обычно она используется для небольших баз, но теоретически способна управиться с терабайтными объемами.

Привязка Ruby к SQLite довольно прямолинейна. API, написанный на С, обернут в класс SQLite::API. Поскольку при этом методы отображаются один в один и интерфейс не назовешь образцом объектной ориентированности, пользоваться этим API стоит только в случае острой необходимости.

В большинстве ситуаций вам будет достаточно класса SQLite::Database. Вот пример кода:

require 'sqlite'

 

db = SQLite::Database.new("library.db")

 

db.execute("select title,author from books") do |row|

p row

end

 

db.close

 

# Выводится:

# ["The Case for Mars", "Robert Zubrin"]

# ["Democracy in America", "Alexis de Tocqueville"]

# ...

Если блок не задан, то метод execute возвращает объект ResultSet (по сути, курсор, который можно перемещать по набору записей).

rs = db.execute("select title,author from books")

rs.each {|row| p row } # Тот же результат, что и выше.

rs.close

Если получен объект ResultSet, то программа должна будет рано или поздно закрыть его (как показано в примере выше). Если нужно обойти список записей несколько раз, то с помощью метода reset можно вернуться в начало. (Это экспериментальное средство, которое в будущем может измениться.) Кроме того, можно производить обход в духе генератора с помощью методовnext и eof?.

rs = db.execute("select title,author from books")

while ! rs.eof?

rec = rs.next

p rec # Тот же результат, что и выше.

end

rs.close

Методы библиотеки могут возбуждать различные исключения. Все они являются подклассами класса SQLite::Exception, так что легко перехватываются поодиночке или целой группой.

Отметим еще, что библиотека написана так, что может работать совместно с библиотекой ArrayFields Ары Ховарда (Ara Howard). Она позволяет получать доступ к элементам массива по индексу или по имени. Если перед sqlite затребована библиотека arrayfields, то объект ResultSet можно индексировать как числами, так и именами полей. (Но можно задать и такую конфигурацию, что вместо этого будет возвращаться объект Hash.)



Хотя библиотека sqlite вполне развита, она не покрывает всех мыслимых потребностей просто потому, что сама база данных SQLite не полностью реализует стандарт SQL92. Дополнительную информацию об SQLite и привязке к Ruby ищите в сети.

Интерфейс с MySQL

Интерфейс Ruby с MySQL — один из самых стабильных и полнофункциональных среди всех интерфейсов с базами данных. Это расширение, которое должно устанавливаться после инсталляции Ruby и MySQL.

Для использования модуля нужно выполнить три шага: прежде всего, загрузить модуль в свой сценарий, затем установить соединение с базой данных и, наконец, начать работать с таблицами. Для установления соединения следует задать обычные параметры: имя хоста, имя пользователя, пароль, имя базы данных и т.д.

require 'mysql'

 

m = Mysql.new("localhost","ruby","secret","maillist")

r = m.query("SELECT * FROM people ORDER BY name")

r.each_hash do |f|

print "#{f['name']} - #{f['email']}"

end

 

# Выводится что-то вроде:

 

# John Doe - jdoe@rubynewbie.com

# Fred Smith - smithf@rubyexpert.com

Особенно полезны методы класса Mysql.new и MysqlRes.each_hash, а также метод экземпляра query.

Модуль состоит из четырех классов (Mysql, MysqlRes, MysqlField и MysqlError), описанных в файле README. Мы приведем сводку некоторых наиболее употребительных методов, а дополнительную информацию вы сможете найти сами в официальной документации.

Метод класса Mysql.new принимает несколько строковых параметров, которые по умолчанию равны nil, и возвращает объект, представляющий соединение. Параметры называются host, user,passwd, db, port, sock и flag. У метода new есть синонимы real_connect и connect.

Методы create_db, select_db и drop_db принимают в качестве параметров имя базы данных и используются, как показано ниже. Метод close закрывает соединение с сервером.

m=Mysql.new("localhost","ruby","secret")

m.create_db("rtest") # Создать новую базу данных.

m.select_db("rtest2") # Выбрать другую базу данных.

in.drop_db("rtest") # Удалить базу данных.

m.close # Закрыть соединение.

В последних версиях методы create_db и drop_db объявлены устаревшими. Но можно «воскресить» их, определив следующим образом:

class Mysql

def create_db(db)

query("CREATE DATABASE #{db}")

end

 

def drop_db(db)

query("DROP DATABASE #{db}")

end

end

Метод list_dbs возвращает список имен доступных баз данных в виде массива.

dbs = m.list_dbs # ["people","places","things"]

Метод query принимает строковый параметр и по умолчанию возвращает объект MysqlRes. В зависимости от заданного значения свойства query_with_result может также возвращаться объектMysql.

Если произошла ошибка, то ее номер можно получить, обратившись к методу errno. Метод error возвращает текст сообщения об ошибке.

begin

r=m.query("create table rtable

(

id int not null auto_increment,

name varchar(35) not null,

desc varchar(128) not null,

unique id(id)

)")

 

# Произошло исключение...

 

rescue

puts m.error

# Печатается: You have an error in your SQL syntax

# near 'desc varchar(128) not null ,

# unique id(id)

# )' at line 5"

 

puts m.errno

# Печатается 1064

# ('desc' is reserved for descending order)

end

Ниже перечислено несколько полезных методов экземпляра, определенных в классе MysqlRes:

• fetch_fields возвращает массив объектов MysqlField, соответствующих полям в следующей строке;

• fetch_row возвращает массив значений полей в следующей строке;

• fetch_hash(with_table=false) возвращает хэш, содержащий имена и значения полей в следующей строке;

• num_rows возвращает число строк в результирующем наборе;

• each — итератор, последовательно возвращающий массив значений полей;

• each_hash(with_table=false) — итератор, последовательно возвращающий хэш вида {имя_поля => значение_поля} (пользуйтесь нотацией x['имя_поля'] для получения значения поля).

Вот некоторые методы экземпляра, определенные в классе MysqlField:

• name возвращает имя поля;

• table возвращает имя таблицы, которой принадлежит поле;

• length возвращает длину поля, заданную при определении таблицы;

• max_length возвращает длину самого длинного поля в результирующем наборе;

• hash возвращает хэш с именами и значениями следующих элементов описания: name, table, def, type, length, max_length, flags, decimals.

Если изложенный здесь материал противоречит онлайновой документации, предпочтение следует отдать документации. Более подробную информацию вы найдете на официальном сайте MySQL (http://www.mysql.com) и в архиве приложений Ruby.





sdamzavas.net - 2017 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...