0

構成の一部を、作成したテスト アプリのデータベースに移動する過程で、非常に奇妙な問題に遭遇しました。テーブルに新しいレコードを作成しようとすると、エラーが発生します。このエラーは、ID 列 (モデルの DataMapper Serial) が null であるために SQL クエリが失敗したことを示しています。このテーブルのスキーマと、新しい行を作成するために使用されているコードは、私が行った変更では変更されていません。

sinatra.error   
#<DataObjects::IntegrityError: transactions.id may not be NULL (code: 19, sql state: , query: INSERT INTO "transactions" ("uuid", "oid", "store", "txndatetime", "chargetotal") VALUES ('...', '', '...', '...', '...')

行を作成する ruby​​ ステートメント:

txn = Transaction.create(:uuid => @uuid, :txndatetime => @timestr, :store => store, :chargetotal => params[:subtotal], :oid => params[:oid])

テーブルのモデル:

class Transaction
  include DataMapper::Resource

  property :id,             Serial
  property :uuid,           String,   :key => true
  property :oid,            String
  property :store,          String
  property :txndatetime,    String
  property :status,         String
  property :refnumber,      String
  property :chargetotal,    String
  property :response_hash,  String,   :length => 255
  property :approval_code,  String
  property :tdate,          String

  validates_presence_of :uuid, :store
  validates_uniqueness_of :uuid
end
4

1 に答える 1

1

ついにそれを理解した。DataMapper auto_upgrade!sqliteデータベースのスキーマを中断しました。テーブルを削除して再生成すると、問題が解決します。

以前のスキーマは次のようになりました。

CREATE TABLE `transactions` (`id` integer NOT NULL, `uuid` varchar(50) NOT NULL, `oid` varchar(50), `store` varchar(50), `txndatetime` varchar(50), `status` varchar(50), `refnumber` varchar(50), `chargetotal` varchar(50), `response_hash` varchar(255), `approval_code` varchar(50), `tdate` varchar(50), `cc_num` varchar(50), `cc_expm` varchar(50), `cc_expy` varchar(50), PRIMARY KEY (`id`, `uuid`));

これで、次のようになります。

CREATE TABLE "transactions" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "uuid" VARCHAR(50) NOT NULL, "oid" VARCHAR(50), "store" VARCHAR(50), "txndatetime" VARCHAR(50), "status" VARCHAR(50), "refnumber" VARCHAR(50), "chargetotal" VARCHAR(50), "response_hash" VARCHAR(255), "approval_code" VARCHAR(50), "tdate" VARCHAR(50), "cc_num" VARCHAR(50), "cc_expm" VARCHAR(50), "cc_expy" VARCHAR(50));

ここでは、欠落しているAUTOINCREMENTが原因のようです。

于 2012-07-20T15:57:47.550 に答える