【问题标题】:Issue with blobs (Cassandra driver, Python)Blob 问题(Cassandra 驱动程序,Python)
【发布时间】:2018-07-14 07:02:42
【问题描述】:

作为测试的一部分,我正在使用 Cassandra Python 驱动程序来尝试选择和删除由 Cassandra 压力工具(Standard1,在 Keyspace1 上)生成的一个表上的所有行。 Standard1 由几个 blob 列组成。

我的方法是提取行的(主)键,然后运行循环以删除基于此的行。

我面临的问题是,Cassandra 驱动程序似乎将 blob(十六进制字节)转换为字符串,因此当我尝试将其传递给删除语句时,它失败并显示“无法将 'XXXXXX' 解析为十六进制字节”。

CQLSH 上表中的数据看起来像“0x303038333830343432”,而下面的选择将键提取为,即“069672027”。

有没有办法防止十六进制字节被转换成字符串?我应该使用其他任何方法吗?

谢谢!

query  = SimpleStatement("SELECT (key) FROM \"Standard1\" LIMIT 10", consistency_level=ConsistencyLevel.LOCAL_QUORUM)
rows = session.execute(query)
for row in rows:
     query = SimpleStatement("DELETE FROM \"Standard1\" WHERE key = %s", consistency_level=ConsistencyLevel.LOCAL_QUORUM)
     session.execute(query, (row.key, ))

【问题讨论】:

    标签: datastax datastax-enterprise


    【解决方案1】:

    当使用简单(未准备的)语句时,您需要从字符串创建一个缓冲区,以便编码器将其识别为 blob 类型。

    http://datastax.github.io/python-driver/getting_started.html#type-conversions

    试试这个:

    session.execute(query, (buffer(row.key),)
    

    另外,绑定一个准备好的语句会隐式地做到这一点。

    【讨论】:

      【解决方案2】:

      聚会有点晚了,但您也可以通过十六进制编码并在前面加上0x 直接转换它。例如:

      '0x{}'.format(row.key.encode('hex'))
      

      【讨论】:

        猜你喜欢
        • 2016-10-02
        • 2019-08-01
        • 2021-02-20
        • 2015-04-12
        • 2017-11-26
        • 2018-06-15
        • 2018-11-10
        • 2018-08-03
        • 1970-01-01
        相关资源
        最近更新 更多