2

Datomic Seattle の例では、挿入時に明示的な ID 番号を使用しています。

{:db/id #db/id[:db.part/user -1000014], :neighborhood/name "Belltown", :neighborhood/district #db/id[:db.part/user -1000013]}
{:community/category ["community council"], :community/orgtype :community.orgtype/community, :community/type :community.type/website, :db/id #db/id[:db.part/user -1000015], :community/name "All About Belltown", :community/url "http://www.belltown.org/", :community/neighborhood #db/id[:db.part/user -1000014]}

単一のスキーマに対する通常の挿入の場合、その場で ID を生成する方がはるかに簡単です。

[
  {
    :db/id #db/id[:db.part/user],
    :car/model \"Ferrari\"
    :car/numberplate \"RENT ME!\"
  }
]

これにより、挿入時にIDが生成されます。

Renter、Car、および RentEvent を表現したい、より複雑なスキーマがあるとします。

私はそれをできた:

[
  {
    :db/id #db/id[:db.part/user],
    :car/model \"Ferrari\"
    :car/numberplate \"RENT ME!\"
  }
]

=> ID 番号を取得し、A に貼り付けます

[
  {
    :db/id #db/id[:db.part/user],
    :renter/name \"John Smith\"
    :renter/socialsecuritynumber \"123456789\"
  }
]

=> ID 番号を取得し、B に貼り付けます

[
  {
    :db/id #db/id[:db.part/user],
    :rentevent/car A
    :rentevent/renter B
  }
]

しかし、それには ID 番号をいろいろいじる必要があります。これを次のような 1 つの大きなブロックに挿入したいと思います。

[
  {
    :db/id #db/id[:db.part/user],      
    :rentevent/car {
      :db/id #db/id[:db.part/user],
      :car/model \"Ferrari\"
      :car/numberplate \"RENT ME!\"
    },
    :rentevent/renter {
      :db/id #db/id[:db.part/user],
      :renter/name \"John Smith\"
      :renter/socialsecuritynumber \"123456789\"
    }
]

これは可能ですか?構文は何ですか?

仮定:

  • これは、制御の分離下にある当事者によって、反復可能なスクリプト化されたデータベースのリリースが本番データベースに対して行われる、監査可能な環境です。つまり、これは、データベースへの変更が行われる前後に監査人が確認できるテキスト ファイルである必要があります。
4

1 に答える 1

4

はい、可能です。トランザクション関数を使用します。

 ; create a constructor-like function
 (def new-rentevent
   (d/function '{:lang :clojure
                 :params [db cm cp rn rs]
                 :code [{:db/id #db/id[:db.part/user -1]
                         :car/model cm
                         :car/numberplate cp}
                        {:db/id #db/id[:db.part/user -2],
                         :renter/name rn
                         :renter/socialsecuritynumber rs}
                        {:db/id #db/id[:db.part/user]
                         :rentevent/car #db/id[:db.part/user -1]
                         :rentevent/renter #db/id[:db.part/user -2]}]}))

 ; transact the function so it can run inside the transactor
 (d/transact conn [{:db/id #db/id[:db.part/user]
                    :db/ident :new-rentevent
                    :db/fn new-rentevent}])

 ; make your application code use the transaction function instead
 (d/transact conn [[:new-rentevent "Ferrari" "RENT ME!" "John Smith" "123456789"]])
 (d/transact conn [[:new-rentevent "Jaguar" "AVAILABLE" "Kate Nash" "567894345"]])
 (d/transact conn [[:new-rentevent "Maserati" "PICK ME!" "Justin Williams" "789134353"]])

完全なコード サンプルについては、このgistを参照してください。詳細については、データベース関数を参照してください。

于 2013-03-25T05:14:12.893 に答える