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 ищите в сети.
10.4.2. Интерфейс с 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возвращает число строк в результирующем наборе;
Читать дальше
Конец ознакомительного отрывка
Купить книгу