2016-04-18 16 views
2

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.

+0

Ein vollständiges, minimales Beispiel wäre hilfreich, und der Stacktrace. – Svante

+0

OK. Ich habe ein Beispiel hinzugefügt ... –

+0

Eigentlich habe ich bemerkt, dass alle Felder eingefügt werden (und auch die ID), aber der ID-Slot ist noch nicht definiert im Objekt ... –

Antwort

1

Es scheint, dass dies nicht funktioniert. es hat eine todo file, das sagt dieser:

  • Test that ":db-kind :key" adds an index for that key. This is complicated by different backends showing autogenerated primary key in different ways.

Also vielleicht ist es nicht mit Postgress funktioniert. Ich glaube, dass du viele Möglichkeiten hast.

Verwenden Sie andere Frameworks ein wenig mehr wie cl-dbi aktualisiert, 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. 

Ich finde einfach ids zu generieren, die Sie in auf- oder absteigender Reihenfolge nach Erstellungszeit leicht mit Zeitstempel oder auch bestellt werden können verwenden kann, Generatoren oder nehmen in Konto die letzte Nummer

einfügen

aber das wird es tun, die Weltzeit und auch eine Zufallszahl hinzufügen, für viele unternehmen in der gleichen Zeit zu schaffen und eine niedrige Rate der Kollision mit

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

Verwandte Themen