TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType
Posted
技术标签:
【中文标题】TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType【英文标题】:TypeError: Unhashable type UserType when creating a Cassandra Python driver model with a Set of a UDT 【发布时间】:2016-08-28 21:57:57 【问题描述】:此问题与 Datastax Cassandra python 驱动程序的对象映射器有关。 尝试使用 UDT 的“集”作为字段创建模型时,出现错误: TypeError: unhashable type: '[UdtClassName]'
但是,我可以创建具有基本类型(例如文本)集的模型或具有 UDT 列表的模型。
请注意,这个问题似乎只存在于对象映射器中,因为我能够使用 CQL 查询在 Cassandra 中创建 UDT 集。
有人遇到过这个问题吗?有人给点建议吗?
我正在使用 python 3.4.4 运行 cassandra python 驱动程序 3.2.2
【问题讨论】:
【参考方案1】:这在 Cassandra 中是可能的(并直接使用核心驱动程序),但 cqlengine 映射器目前不支持它。原因是遗留 API 限制,其中映射器规范化为集合和映射的基本 python 类型。因此,API 对集合元素和映射键具有相同的哈希性要求。
我们有一张票here,但它需要等待下一个主要版本,因为这意味着 API 会发生变化。
您可以尝试通过在您的 UDT 模型类上提供哈希来解决此问题(如果有意义的话)。
【讨论】:
好的,非常感谢您的建议!实现 hash 现在确实可以,但是您是否预见到简单地实现它可能会出现任何问题?这似乎太容易了,我对 hash ... 没有太多经验 一个陷阱是,如果您的 UDT 具有可变元素,这些元素可以在散列进入集合后更改散列。如果您在每个集合的生命周期中将对象视为常量,我预计不会有任何问题。 澄清一下,在我之前的评论中,我的意思是写 __hash___,而不是 hash 如何在 UDT 集上使用哈希?任何例子,都会有很大帮助【参考方案2】:从 Adam 扩展,在 UserType 上使用哈希
class Client(UserType):
mac = columns.Text()
rx = columns.Integer()
tx = columns.Integer()
def __hash__(self):
return hash((self.mac, self.rx, self.tx))
谢谢亚当。
【讨论】:
以上是关于TypeError:使用一组 UDT 创建 Cassandra Python 驱动程序模型时不可散列的类型 UserType的主要内容,如果未能解决你的问题,请参考以下文章
Cassandra List<UDT> 未使用 datastax java driver 4.0.0 反序列化