Автоматически сгенерированный первичный ключ в 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)
Я не совсем понимаю эту ошибку, но строка, кажется, вставлена в базу данных.
1 ответ
Кажется, это не сработает. у него есть файл todo, который говорит это:
- Проверьте, что ":db-kind:key" добавляет индекс для этого ключа. Это усложняется разными бэкэндами, показывающими автоматически сгенерированный первичный ключ по-разному.
Так что, возможно, это не работает с postgress. Я считаю, что у вас есть много возможностей.
Используйте немного более обновленные фреймворки, такие как cl-dbi, посмотрите здесь:
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.
Я нахожу легким генерировать идентификаторы, которые можно упорядочить в порядке возрастания или убывания по времени создания легко с отметкой времени, а также вы можете использовать генераторы или принять во внимание последний номер, который вы вставили
но это сделает трюк, универсальное время, а также добавит случайное число, для создания множества объектов одновременно и с низкой частотой столкновений.
(формат nil "~12,'0d ~ ~6,'0d" (время получения универсального) (случайное 1000000))
Из "Любить Лисп" Марка Уотсона - 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)))