common-lisp
データベースの操作
サーチ…
ポストモダンでのPostgreSQLの使い方
Postmodernは、 PostgreSQLのリレーショナルデータベースとインタフェースするためのライブラリです。これは、文字列として、またはリストとして表現された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
をクエリ関数に:plists
して:plists
ことができます。
query
の代わりに、 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
などでクエリを受け取り、各プレースホルダーに1つのパラメーターを必要とする新しい関数を返し、適切な数の引数で呼び出されたときにクエリを実行します。
更新の場合、関数exec
は変更されたタプルの数を返します(2つの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