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\"
}
]
=>获取身份证号码并将其粘贴在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\"
}
]
这可能吗?语法是什么?
假设:
答案 0 :(得分: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。有关详细信息,请参阅Database Functions。