2016-12-13 1 views
2

Я новичок в Cassandra, и я пытаюсь использовать CQLEngine ORM для обновления набора столбцов, который содержит UDT, но я не могу и документация ничего не говорит о пользовательских типах.Обновление UDT Set с CQLEngine

Мой код:

class MyType(UserType): 

    val = columns.Text() 
    point = columns.Integer() 
    key = columns.Text() 

    def __init__(self, val, point, key, **values): 
     super().__init__(**values) 
     self.val = val 
     self.point = point 
     self.key = key 


class MyModel(Model): 

    myid = columns.UUID(primary_key=True) 
    set_clm = columns.Set(columns.Integer) 
    mytype = columns.Set(UserDefinedType(MyType)) 

    def __init__(self, set_clm, mytype, **values): 
     super().__init__(**values) 
     self.myid = uuid4() 
     self.set_clm = set_clm 
     self.mytype = mytype 



s = MyModel.objects(myid="2b3adb7d-9e68-49fc-9aa0-26dbec607f9d").update(
    mytype__add=set(MyType(val="1", point=2, key="3")) 
) 

MyModel изначально имеет в наборе NULL, но когда я пытаюсь обновить его, я получаю следующее сообщение об ошибке:

cassandra.InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid set literal for mytype: value 'point' is not of type frozen<mytype>"

'point' is not of type frozen<mytype> -> Эта часть случайным образом изменяется каждый раз, когда я повторно запустить код (следующий время, которое я запускал, я получал бы ту же ошибку для столбца «val» и т. д.).

Может ли кто-нибудь помочь мне, как я могу добавить набор UDT?

ответ

0

OK. Я решил это. Я пишу его людям, которые найдут его в Google.

Это правильный способ добавления к набору: mytype__add={MyType(val="1", point=2, key="3")}

, а также осуществлять __hash__ функцию MyType, таких как:

def __hash__(): 
    return hash(self.__repr__()) 

, но с более умным __hash__ функции. Это просто пример. Надеюсь, это поможет кому-то другому.