Поиск…


Простое использование PostgreSQL с Postmodern

Postmodern - это библиотека для взаимодействия реляционной базы данных PostgreSQL . Он предлагает несколько уровней доступа к PostgreSQL, от выполнения SQL-запросов, представленных в виде строк или списков, к объектно-реляционному сопоставлению.

База данных, используемая в следующих примерах, может быть создана с помощью этих операторов SQL:

create table employees
  (empid integer not null primary key,
   name text not null,
   birthdate date not null,
   skills text[] not null);
insert into employees (empid, name, birthdate, skills) values
  (1, 'John Orange', '1991-07-26', '{C, Java}'),
  (2, 'Mary Red', '1989-04-14', '{C, Common Lisp, Hunchentoot}'),
  (3, 'Ron Blue', '1974-01-17', '{JavaScript, Common Lisp}'),
  (4, 'Lucy Green', '1968-02-02', '{Java, JavaScript}');

В первом примере показан результат простого запроса, возвращающего отношение:

CL-USER> (ql:quickload "postmodern")   ; load the system postmodern (nickname: pomo)
("postmodern")
CL-USER> (let ((parameters '("database" "dbuser" "dbpass" "localhost")))
           (pomo:with-connection parameters
             (pomo:query "select name, skills from employees")))
(("John Orange" #("C" "Java"))                  ; output manually edited!
 ("Mary Red" #("C" "Common Lisp" "Hunchentoot"))
 ("Ron Blue" #("JavaScript" "Common Lisp"))
 ("Lucy Green" #("Java" "JavaScript")))
4                                               ; the second value is the size of the result

Обратите внимание, что результат может быть возвращен как список alists или plists, добавляющий необязательные параметры :alists или :plists к функции запроса.

Альтернативой query является doquery , чтобы перебирать результаты запроса. Его параметрами являются query (&rest names) &body body , где имена привязаны к значениям в строке на каждой итерации:

CL-USER> (let ((parameters '("database" "dbuser" "dbpass" "localhost")))
           (pomo:with-connection parameters
             (format t "The employees that knows Java are:~%")
             (pomo:doquery "select empid, name from employees where skills @> '{Java}'" (i n)
               (format t "~a (id = ~a)~%" n i))))
The employees that knows Java are:
John Orange (id = 1)
Lucy Green (id = 4)
NIL
2

Когда запрос требует параметров, можно использовать подготовленные операторы:

CL-USER> (let ((parameters '("database" "dbuser" "dbpass" "localhost")))
           (pomo:with-connection parameters
             (funcall
               (pomo:prepare "select name, skills from employees where skills @> $1")
               #("Common Lisp"))))    ; find employees with skills including Common Lisp
(("Mary Red" #("C" "Common Lisp" "Hunchentoot"))
 ("Ron Blue" #("JavaScript" "Common Lisp")))
2

Функция prepare получает запрос с заполнителями $1 , $2 и т. Д. И возвращает новую функцию, которая требует одного параметра для каждого заполнителя и выполняет запрос при вызове с правильным количеством аргументов.

В случае обновлений функция exec возвращает количество измененных кортежей (два оператора DDL заключены в транзакцию):

CL-USER> (let ((parameters '("database" "dbuser" "dbpass" "localhost")))
           (pomo:with-connection parameters
             (pomo:ensure-transaction
               (values
                 (pomo:execute "alter table employees add column salary integer")
                 (pomo:execute "update employees set salary =
                                     case when skills @> '{Common Lisp}'
                                     then 100000 else 50000 end")))))
0
4

В дополнение к написанию SQL-запросов в виде строк можно использовать списки ключевых слов, символов и констант с синтаксисом, напоминающим lisp (S-SQL):

CL-USER> (let ((parameters '("database" "dbuser" "dbpass" "localhost")))
           (pomo:with-connection parameters
             (pomo:query (:select 'name :from 'employees :where (:> 'salary 60000)))))
(("Mary Red") ("Ron Blue"))
2


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow