Ich versuche, eine einfache Datenbank mit Common Lisp ORM zu machen. Ich benutze PostgreSQL und CLSQL. Ich könnte Klassen erstellen und Tabellen generieren, aber es funktioniert nicht, wenn ich einen Wert ohne Primärschlüssel einfügen möchte, um einen generierten Wert zu erhalten. Es scheint, dass es mit MySQL-Datenbanken funktioniert. Ist das mit PostgreSQL möglich?Automatisch generierter Primärschlüssel in Postgresql mit Clsql
definiere ich den Primärschlüssel als:
(id :db-kind :key
:db-type "serial"
:db-constraints (:not-null :unique)
:type integer
:initarg :id)
Und ich bekomme diese Fehlermeldung:
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]
Ich benutze PostgreSQL 9.5.2 mit SBCL 1.3.1.
bearbeiten
Hier ist ein Beispiel:
(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)
ich nicht wirklich verstehen, um diesen Fehler, aber die Zeile scheint in die Datenbank eingefügt werden.
Ein vollständiges, minimales Beispiel wäre hilfreich, und der Stacktrace. – Svante
OK. Ich habe ein Beispiel hinzugefügt ... –
Eigentlich habe ich bemerkt, dass alle Felder eingefügt werden (und auch die ID), aber der ID-Slot ist noch nicht definiert im Objekt ... –