使用clsql在postgresql中自动生成主键

时间:2016-04-18 07:23:41

标签: postgresql orm common-lisp sbcl clsql

我试图使用Common Lisp ORM创建一个简单的数据库。我使用PostgreSQL和CLSQL。我可以创建类并生成表,但是当我想插入没有主键的值以获得生成的值时,它不起作用。它似乎适用于mysql数据库。是否有可能使用PostgreSQL?

我将主键定义为:

(id :db-kind :key
    :db-type "serial" 
    :db-constraints (:not-null :unique)
    :type integer
    :initarg :id)

我收到了这个错误:

While accessing database #<POSTGRESQL-DATABASE localhost/cl_ormex/postgres OPEN {1004FCC403}>
  with expression "SELECT currval ('NIL')":
   Error 42P01 / relation "nil" does not exist
   LINE 1: SELECT currval ('NIL')
                           ^  
 has occurred.
   [Condition of type SQL-DATABASE-DATA-ERROR]

我使用PostgreSQL 9.5.2和SBCL 1.3.1。

修改

以下是一个例子:

(require 'clsql)
(defpackage :orm-ex (:use :cl :clsql))
(in-package :orm-ex)
(file-enable-sql-reader-syntax)
(enable-sql-reader-syntax)
(setf *default-caching* nil)
(connect '("localhost" "examp" "postgres" "postgres")
     :database-type :postgresql)

(def-view-class person ()
  ((id :db-kind :key
       :db-type "serial"
       :db-constraints (:not-null :unique)
       :type integer
       :initarg :id
       :accessor person-id)
   (name :type (varchar 30)
     :initarg :name
     :accessor person-name)))

(defparameter person1
  (make-instance 'person
         :name "Matt"))

(dolist (c '(person)) (create-view-from-class c))
(update-records-from-instance person1)

我真的不明白这个错误,但该行似乎已插入数据库中。

2 个答案:

答案 0 :(得分:2)

马克·沃森(Mark Watson)的《爱恋Lisp》-db-constraints需要使用:auto-increment进行定义。
注意-截至今天(2019年10月25日)的图书版本不正确,但下载的代码为:

(clsql:def-view-class article ()
  ((id
    :db-kind :key
    :db-constraints (:auto-increment :not-null :unique)
    :type integer
    :initarg :id)
   (uri
    :accessor uri
    :type (string 60)
    :initarg :uri)
   (title
    :accessor title
    :type (string 90)
    :initarg :title)
   (text
    :accessor text
    :type (string 500)
    :nulls-ok t
    :initarg :text)))

答案 1 :(得分:1)

似乎这不起作用。它有一个todo file,上面写着:

  
      
  • 测试&#34;:db-kind:key&#34;为该键添加索引。由于显示自动生成的主键的不同后端,这很复杂   以不同的方式。
  •   

所以也许它不适用于postgress。我相信你有很多可能性。

使用更新的其他框架,如cl-dbi,take a look here:

cl-dbi provides a uniform interface to the various database server-specific libraries (cl-postgres, cl-mysql, etc.). SxQL provides a DSL for building safe, automatically parameterized SQL queries.

There are two fairly complete ORMs: Crane, by yours truly, and Integral, by the author of cl-dbi.

Consolidation:

Discourage using anything other than cl-dbi.

Future Work:

Bindings for other database systems, e.g. Oracle, exist. Writing drivers for cl-dbi would be the best course of action and help consolidation.

我发现很容易生成ID,可以通过创建时间轻松地按时间戳按升序或降序排序,或者您也可以使用生成器或考虑插入的最后一个数字

但是这会有技巧,通用时间并且还会添加一个随机数,用于同时创建多个实体并且碰撞率低

  

(格式为nil&#34; ~12,&#39; 0d-~6,&#39; 0d&#34;(get-universal-time)(随机1000000))