4

我正在尝试使用 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)

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

4

2 回答 2

3

来自 Mark Watson 的 Loving Lisp -db-constraints需要用:auto-increment.
注意-截至今天(25/10/2019)的书版本不正确,但下载的代码是:

(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)))
于 2019-10-25T06:58:25.680 回答
1

看来这行不通。它有一个todo 文件,上面写着:

  • 测试 ":db-kind :key" 是否为该键添加了索引。这因不同的后端以不同的方式显示自动生成的主键而变得复杂。

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

使用其他更新一些的框架,比如 cl-dbi,看看这里:

cl-dbi 为各种数据库服务器特定的库(cl-postgres、cl-mysql 等)提供统一的接口。SxQL 为构建安全、自动参数化的 SQL 查询提供了 DSL。

有两个相当完整的 ORM:Crane,由你真正的,和 Integral,由 cl-dbi 的作者。

巩固:
不鼓励使用 cl-dbi 以外的任何东西。

未来的工作:

存在其他数据库系统的绑定,例如 Oracle。为 cl-dbi 编写驱动程序将是最好的做法并有助于整合。

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

但这会起作用,通用时间并添加一个随机数,用于同时创建许多实体并具有低碰撞率

(format nil "~12,'0d-~6,'0d" (get-universal-time) (random 1000000))
于 2016-06-08T14:49:28.850 回答