3

私は Cassandra を初めて使用し、CQLEngine ORM を使用して UDT を保持するセット列を更新しようとしていますが、それはできず、ドキュメントにはカスタム型について何も記載されていません。

私のコードは;

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 セットを追加する方法を教えてください。

4

1 に答える 1

1

わかった。私はそれを解決しました。Googleで見つけた人のために書き留めておきます。

これはセットに追加する正しい方法です:mytype__add={MyType(val="1", point=2, key="3")}

__hash__次のような MyTypeの関数も実装します。

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

しかし、よりスマートな__hash__機能を備えています。これはほんの一例です。それが他の誰かに役立つことを願っています。

于 2016-12-14T21:17:44.627 に答える