2016-04-18 12 views
2

私はCommon Lisp ORMを使って簡単なデータベースを作ろうとしています。私はPostgreSQLとCLSQLを使用します。クラスを作成してテーブルを生成することもできますが、生成された値を取得するためにプライマリキーを使用せずに値を挿入する場合は機能しません。それはmysqlデータベースで動作するようです。 PostgreSQLでそれを行うことは可能ですか?clsqlを使った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] 

私はSBCL 1.3.1でのPostgreSQL 9.5.2を使用します。

編集

はここに例を示します

(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) 

私は本当にこのエラーを理解していないが、行がデータベースに挿入されているように見えます。

+0

完全な最小限の例が参考になるでしょうし、stacktrace。 – Svante

+0

OK。私は例を追加しました... –

+0

実際には、すべてのフィールドが挿入されていることに気付きましたが、IDスロットはまだオブジェクト内で定義されていません... –

答えて

1

これはうまくいかないようです。

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

ので、多分それははpostgressでは動作しません:それはこのことを言うtodo fileを持っています。私はあなたに多くの可能性があると信じています。

も使用する他のもう少しCL-DBIのように更新フレームワーク、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. 

私はタイムスタンプで簡単に作成時間によって昇順または降順で注文することができるIDを生成するために簡単に見つけますか発電機を使用するか、アカウントに取る最後の数はあなたが

を挿入するが、これはトリックを行います、世界時をしても衝突率の低さを同時に多数のエンティティを作成したために、乱数を追加することができます

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

関連する問題