Datomic插入块

时间:2013-03-24 05:34:52

标签: schema datomic

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

这可能吗?语法是什么?

假设:

  • 这是一个可审核的环境,其中由分离控件的一方对生产数据库执行可重复的脚本化数据库发布。即 - 这需要是审核员在更改数据库之前和之后可以查看的文本文件。

1 个答案:

答案 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