2013-03-24 26 views
2

的Datomic西雅圖例子執行插入時使用明確的ID號:Datomic插入塊

{: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。

假設我有一個更復雜的模式,我想表示租戶,租車和RentEvent。

我可以這樣做:

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

=>獲得ID號和堅持在

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

這可能嗎?什麼是語法?

假設:

  • 這是一個可審覈的環境中,可重複的腳本的數據庫版本是由當事人是誰下的控制分離進行生產數據庫。也就是說 - 這需要是一個文本文件,審計人員可以在更改數據庫之前和之後查看這些文本文件。
+0

如下所述,您可以通過交易功能將您的應用程序代碼與樣板/重複代碼隔離開來,還有其他您正在尋找的東西嗎? – a2ndrade 2013-04-29 04:39:56

+0

是的 - 我一直在尋找一種方法來處理datomic id,當它們從datomic外殼中插入時。 – hawkeye 2013-04-29 11:00:32

+0

殼沒有什麼不同。即使您正在使用內存交易器,您仍然可以創建交易功能並使用它。請注意,您必須僅處理一次** **函數,然後您可以使用'new-rentevent'函數**原子**交易儘可能多的「租賃事件」。 「[:new-rentevent」法拉利「」租我!「)的語法可能不會更簡潔。 「John Smith」「123456789」]]'如下所述。讓我知道如果我錯過了什麼。 – a2ndrade 2013-04-29 14:48:41

回答

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

+0

對不起 - 我認爲這是一個審計控制的生產發佈環境(即向數據庫發佈文本腳本)。您是否在意更新您的答案? – hawkeye 2015-03-17 10:34:17