2014-09-05 2 views
4

Я создал набор атрибутов в Datomic схеме. Их: db/idents сгруппированы в три пространства имен:: name,: tree,: node. Теперь я хочу удалить все из них и начать новый. Я нашел все необходимые атрибуты:Как убрать атрибуты в Datomic?

(def results 
    (q '[:find ?e 
     :where [?e :db/ident ?v] 
       [(namespace ?v) ?res] 
       [(contains? #{"task", "node", "tree"} ?res)] 
    ] 
    (db conn))) 

Затем создал набор операторов retractEntity:

(def retract-statements 
    (into [] (map #(vector :db.fn/retractEntity (first %1)) results))) 

И теперь я пытаюсь вызвать сделку:

@(d/transact conn [retract-statements]) 

Это дает мне: : db.error/invalid-attribute При изменении схемы должны следовать: db.install/attribute или: db.alter/attribute

Видимо, я делаю что-то неправильно. Кто-то может помочь?

Спасибо!

+0

Ваши векторы вложены слишком много? Вам нужно сделать '@ (d/transact conn retract-statements)', вместо '@ (d/transact conn [retract-statements]) - потому что retract-statements уже вектор векторов. Просто мысль ... –

+1

Я только что использовал (удалить-database uri) и (create-database uri), что отлично подходит для моих целей. Кажется, что нет способа отменить атрибуты - кажется, что единственный возможный способ избавиться от всех атрибутов - это переименование. Это правильное утверждение? – siphiuel

+1

Да, я думаю, что вы правы https://groups.google.com/forum/#!msg/datomic/7-9lUE9Nm4k/fOhAvt-gyOIJ –

ответ

6

Невозможно напрямую отменить атрибуты в Datomic. Как только вы установите атрибут, он будет навсегда, если вы не удалите всю базу данных. Это имеет смысл, учитывая, что Datomic (за исключением специального случая исключения) никогда не удаляет действительно никаких данных - если бы вы могли фактически удалить атрибуты, тогда данные, первоначально выполненные против этих атрибутов, не были бы извлечены.

Обратите внимание, что вы можете переименовать атрибуты, но он сохраняет свой старый идентификатор как синоним, если вы не перепрофилируете его для чего-то другого.