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
  }
]

但这涉及到大量的身份证号码。我想将它插入一个大块中,例如:

[
  {
    :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"]])

有关完整的代码示例,请参阅此要点。有关详细信息,请参阅数据库函数

于 2013-03-25T05:14:12.893 回答