(blog ‘lucindo)

um dia eu aprendo a programar

Common Lisp e PostgreSQL

Brincando um pouco com Postmodern:

(eval-when (:compile-toplevel :load-toplevel :execute)
  (require :postmodern))

(defpackage :pg-test
  (:use :cl :postmodern))

(in-package :pg-test)

(defparameter *db-name* “lucindo”)
(defparameter *db-user* “lucindo”)
(defparameter *db-pass* “”)
(defparameter *db-host* “localhost”)

;; global connection
(eval-when (:execute)
  (connect-toplevel *db-name* *db-user* *db-pass* *db-host*))

;; defines a table (and a CLOS class)
(deftable user ()
  ((id :type integer
       :initarg :id
       :accessor id)
   (name :type (or string db-null)
         :initarg :name
         :initform :null
         :accessor name)
   (points :type (numeric 10 3)
           :initarg :points
           :accessor points))
  (:indices id points)
  (:class-name user))

;; creates the table if not exists
(defun setup ()
  (when (not (table-exists-p :user))
    (create-table ‘user)))

(defun create-update-user (id name &optional (points 0.0))
  (save-dao (make-instance ‘user :id id :name name :points points)))

(defun get-user-by-id (id)
  (get-dao ‘user id))

Se você precisar escrever SQL pode usar o mapeamento para expressões Lisp, como:

(:select ‘relname
         :from ‘pg-catalog.pg-class
         :inner-join ‘pg-catalog.pg-namespace
         :on (:= ‘relnamespace ‘pg-namespace.oid)
         :where (:and (:= ‘relkind “r”)
                      (:not-in ‘nspname (:set “pg_catalog” “pg_toast”))
                      (:pg-catalog.pg-table-is-visible ‘pg-class.oid)))

A lib é bem completa, com connection pools, prepared statements, … e 100% Common Lisp (você não precisa ter nada do PostgreSQL instalado na máquina cliente).

Update: deftable não tem suporte a foreign keys :(



 | Enviar por e-mail  | Hits para esta publicação: 507

Deixe uma resposta.