수색…


Postmodern을 이용한 PostgreSQL의 간단한 사용

PostmodernPostgreSQL 관계형 데이터베이스를 인터페이스하는 라이브러리입니다. 문자열로 표현 된 SQL 질의의 실행이나 목록으로부터 객체 - 관계형 매핑에 이르기까지 PostgreSQL에 대한 몇 가지 액세스 레벨을 제공합니다.

다음 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 함수는 placeholder $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