Книга: Программирование на языке Ruby

10.4.3. Интерфейс с PostgreSQL

10.4.3. Интерфейс с PostgreSQL

В архиве RAA есть также расширение, реализующее доступ к СУБД PostgreSQL (работает с версиями PostgreSQL 6.5/7.0).

В предположении, что PostgreSQL уже установлена и сконфигурирована (и в базе данных есть таблица testdb), нужно лишь выполнить те же шаги, что и для всех остальных интерфейсов Ruby с базами данных: загрузить модуль, установить соединение с базой данных и начать работу. Надо полагать, вам понадобится способ послать запрос, получить результаты и работать с транзакциями.

require 'postgres'
conn = PGconn.connect("", 5432, "", "", "testdb")
conn.exec("create table rtest ( number integer default 0 );")
conn.exec("insert into rtest values ( 99 )")
res = conn.query("select * from rtest")
# res id [["99"]]

В классе PGconn есть метод connect, который принимает обычные параметры для установления соединения: имя хоста, номер порта, имя базы данных, имя и пароль пользователя. Кроме того, третий и четвертый параметры — соответственно, флаги и параметры терминала. В приведенном примере мы установили соединение через сокет UNIX от имени привилегированного пользователя, поэтому не указывали ни имя пользователя, ни пароль, а имя хоста, флаги и параметры терминала оставили пустыми. Номер порта должен быть целым числом, а остальные параметры — строками. У метода connect есть синоним new.

Для работы с таблицами нужно уметь выполнять запросы. Для этого служат методы PGconn#exec и PGconn#query.

Метод exec посылает переданную ему строку — SQL-запрос — серверу PostgreSQL и получает ответ в виде объекта PGresult, если выполнение завершилось успешно. В противном случае он возбуждает исключение PGError.

Метод query также посылает свой строковый параметр в виде SQL-запроса. Но в случае успеха получает массив кортежей. В случае ошибки возвращается nil, а подробности можно получить, вызвав метод error.

Имеется специальный метод insert_table для вставки записи в указанную таблицу. Вопреки названию он не создает новую таблицу, а добавляет данные в существующую. Этот метод возвращает объект PGconn.

conn.insert_table("rtest",[[34]])
res = conn.query("select * from rtest")
res равно [["99"], ["34"]]

В этом примере в таблицу rtest вставляется одна строка. Для простоты мы указали только одну колонку. Отметим, что объект res класса PGresult после обновления возвращает массив из двух кортежей. Чуть ниже мы рассмотрим методы, определенные в классе PGresult.

В классе PGconn определены также следующие полезные методы:

• db возвращает имя базы, с которой установлено соединение;

• host возвращает имя сервера, с которым установлено соединение;

• user возвращает имя аутентифицированного пользователя;

• error возвращает сообщение об ошибке;

• finish, close закрывают соединение;

• loimport(file) импортирует файл в большой двоичный объект (BLOB), в случае успеха возвращает объект PGlarge, иначе возбуждает исключение PGError;

• loexport(oid, file) выгружает BLOB с идентификатор oid в указанный файл;

• locreate([mode]) возвращает объект PGlarge в случае успеха, иначе возбуждает исключение PGError;

• loopen(oid, [mode]) открывает BLOB с идентификатором oid. Возвращает объект PGlarge в случае успеха. Аргумент mode задает режим работы с открытым объектом: "INV_READ" или "INV_WRITE" (если этот аргумент опущен, по умолчанию предполагается "INV_READ");

• lounlink(oid) удаляет BLOB с идентификатором oid.

Отметим, что пять последних методов (loimport, loexport, locreate, loopen и lounlink) работают с объектами класса PGlarge. У этого класса есть собственные методы для доступа к объекту и его изменения. (BLOB'ы создаются в результате выполнения методов loimport, locreate, loopen экземпляра.)

Ниже перечислены методы, определенные в классе PGlarge:

• open([mode]) открывает BLOB. Аргумент mode задает режим работы с объектом, как и в случае с методом PGconn#loopen);

• close закрывает BLOB (BLOB'ы также закрываются автоматически, когда их обнаруживает сборщик мусора);

• read([length]) пытается прочитать length байтов из BLOB'a. Если параметр length не задан, читаются все данные;

• write(str) записывает строку в BLOB и возвращает число записанных байтов;

• tell возвращает текущую позицию указателя;

• seek(offset, whence) перемещает указатель в позицию offset. Параметр whence может принимать значения SEEK_SET, SEEK_CUR и SEEK_END (равные соответственно 0,1,2);

• unlink удаляет BLOB;

• oid возвращает идентификатор BLOB'a;

• size возвращает размер BLOB'a;

• export(file) сохраняет BLOB в файле с указанным именем.

Более интересны методы экземпляра, определенные в классе PGresult (перечислены ниже). Объект такого класса возвращается в результате успешного выполнения запроса. (Для экономии памяти вызывайте метод PGresult#clear по завершении работы с таким объектом.)

• result возвращает массив кортежей, описывающих результат запроса;

• each — итератор;

• [] — метод доступа;

• fields возвращает массив описаний полей результата запроса;

• num_tuples возвращает число кортежей в результате запроса;

• fieldnum(name) возвращает индекс поля с указанным именем;

• type(index) возвращает целое число, соответствующее типу поля;

• size(index) возвращает размер поля в байтах. 1 означает, что поле имеет переменную длину;

• getvalue(tup_num, field_num) возвращает значение поля с указанным порядковым номером; tup_num — номер строки;

• getlength(tup_num, field_num) возвращает длину поля в байтах;

• cmdstatus возвращает строку состояния для последнего запроса;

• clear очищает объект PGresult.

Оглавление книги


Генерация: 1.348. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз