04 декабря 2011

Restas и Postmodern

А я напоминаю, что для подключения роутов restas сайта к postgresql базе данных служит такой механизм, как декораторы.

Действия такие:
Создаем класс унаследованный от routes:proxy-route.
Переопределяем для него метод restas:process-route, в котором:
  подключаемся к базе, и в этом контексте
    вызываем базовый метод routes:proxy-route.
Создаем функцию, возвращающую экземпляр данного класса.

Например:

  • *pgname* Имя БД
  • *pguser* Пользователь
  • *pgpassword* Пароль
  • *pghost* Сервер
  • *pgschema* Имя схемы
  • *company-name* Будет содержать комментарий для схемы *pgschema*
(defclass pg-connection-route (routes:proxy-route) ())

(defmethod restas:process-route ((route pg-connection-route) bindings)
  (postmodern:with-connection (list *pgname* *pguser* *pgpassword* *pghost*)
    (postmodern:execute (format nil "set search_path=~a,public" *pgschema*))
    (let* ((*company-name* (postmodern:query "select description from pg_description join pg_namespace on objoid = oid and nspname = $1" *pgschema* :single)))
      (call-next-method))))

(defun @pg-connection (route)
  (make-instance 'pg-connection-route :target route))

Здесь кроме подключения, мы устанавливает в sql переменную search_path список тех схем базы данных, в которых в будущем будет производится поиск таблиц.

Использование:

(restas:define-route choose-client ("choose-client"
                                    :decorators '(@pg-connection))
  (list :rows
         (postmodern:query "select 12 'test'")
        :title "select"))

2 комментария:

  1. Ну что кто-то понял этот механизм уже радует ))

    ОтветитьУдалить
  2. А как жеш, лень-матушка говорит, что не следует в каждом роуте коннекты писать. Надо только красивую передачу параметров подключения сделать.

    ОтветитьУдалить