Автоматически сгенерированный первичный ключ в postgresql с помощью 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)

Я не очень понимаю эту ошибку, но кажется, что строка вставлена ​​в базу данных.


person andrei-n    schedule 18.04.2016    source источник
comment
Полный минимальный пример был бы полезен, а трассировка стека.   -  person Svante    schedule 19.04.2016
comment
В ПОРЯДКЕ. Я добавил пример...   -  person andrei-n    schedule 19.04.2016
comment
На самом деле, я заметил, что все поля вставлены (а также id), но слот id все еще не определен в объекте...   -  person andrei-n    schedule 20.04.2016


Ответы (2)


Кажется, что это не сработает. в нем есть файл задач, в котором говорится следующее:

  • Проверьте, что ":db-kind :key" добавляет индекс для этого ключа. Это осложняется тем, что разные серверные части по-разному отображают автоматически сгенерированный первичный ключ.

Так что, возможно, это не работает с Postgres. Я верю, что у тебя много возможностей.

Используйте другие более современные фреймворки, такие как cl-dbi, посмотрите здесь:

cl-dbi предоставляет единый интерфейс для различных библиотек, специфичных для сервера баз данных (cl-postgres, cl-mysql и т. д.). SxQL предоставляет DSL для построения безопасных, автоматически параметризуемых SQL-запросов.

Есть два довольно полных ORM: Crane, искренне ваш, и Integral, автор cl-dbi.

Консолидация:
Не рекомендуется использовать что-либо кроме cl-dbi.

Будущая работа:

Привязки для других систем баз данных, например Оракул, существует. Написание драйверов для cl-dbi будет лучшим способом действий и поможет консолидации.

Мне легко генерировать идентификаторы, которые можно упорядочивать в порядке возрастания или убывания по времени создания, легко с отметкой времени, или вы также можете использовать генераторы или учитывать последнее число, которое вы вставляете.

но это сделает трюк, универсальное время, а также добавит случайное число для одновременного создания множества объектов и низкой скорости столкновений.

(format nil "~12,'0d-~6,'0d" (get-universal-time) (random 1000000))
person anquegi    schedule 08.06.2016

Из 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)))
person paulj    schedule 25.10.2019
comment
Я также должен указать, что вам нужно будет обновить свойства таблицы, если вы создали ее без вышеуказанных ограничений. В моем случае в нем не было данных, поэтому я удалил его и заново создал из лиспа с новыми данными о классе. - person paulj; 25.10.2019