lispmxEn 2018-01-15 12:11:54



Quiero ejecutar algunos queries con postgresql y lisp, para eso necesitamos una libreria que nos permita la comunicación entre postgresql y lisp, la librería que vamos a usar es:  postmodern.

Para más información sobre la librería:
  http://marijnhaverbeke.nl/postmodern/#quickstart

Lo primero que vamos hacer es crear un usuario y una base de datos en postgresql.


En nuestra terminal interactiva de PostgreSQL ejecutamos los siguiente:


create user foo with password 'foobar';

create database bar owner foo ;

Ahora vamos a cargar nuestra librería con quicklisp

(ql:quickload "postmodern")
To load "postmodern":
  Load 1 ASDF system:
    postmodern
; Loading "postmodern"

("postmodern")

Después de eso vamos a crear un archivo con lo siguiente, el nombre del archivo puede ser el de tu preferencia.

(in-package :postmodern)

;;  Defino una variable global para poner los datos de la conexión a postgresql
(defvar *db-parameters* '("bar" "foo" "foobar" "localhost" :POOLED-P T))

;; definimos un macro para hacer la conexión a postgresql y ejecutar queries
(defmacro with-database (&body query)
  "This macro creates the connection and disconnection with specified database in *db-parameter* and execute the query."
  `(postmodern:with-connection *db-parameters* ,@query))

;;; Definimos una simple tabla para nuestro ejemplo
(deftable fruits
  (:create-table fruits
         ((id_fruit
           :type :serial
           :primary-key t
           :unique t)
          (name
           :type string))))
(with-database
  (create-table 'fruits))

;;; Definimos algunas funciones para ejecutar los ejemplos de: insert, select, update y delete

(defun insert (name)
  (with-database
      (query (:insert-into 'fruits
               :set 'name name))))
 
(defun select-by (id)
  (with-database
    (query (:select 'name
            :from 'fruits
            :where (:= 'id_fruit id)) :single)))

(defun update-name-by (id new-name)
  (with-database
    (query (:update 'fruits
            :set 'name new-name
            :where (:= 'id_fruit id)))))

(defun delete-by (id)
  (with-database
    (query (:delete-from 'fruits
             :where (:= 'id_fruit id)))))

Después de haber creado las funciones las vamos a usar.

Probando las funciones en nuestro entorno de programación
 
POMO> (insert "appple")
NIL
1
 
POMO> (select-by 1)
"appple"
1

POMO> (update-name-by 1 "apple")
NIL
1

POMO> (delete-by 1)
NIL
1
 

Autor: Juan Reynoso

Hacks and glory await!
#lisp #postmodern


También te puede interesar
lisp codeEn 2022-07-13 13:12:00