【问题标题】:Store numpy array in MySQL (reloaded)在 MySQL 中存储 numpy 数组(重新加载)
【发布时间】:2020-10-30 08:06:24
【问题描述】:

这将是一个副本 store numpy array in mysql 。原因是那里没有回答 实际 问题,5 年后我(另一个随机的人)也在为同样的问题苦苦挣扎。

目标

我有很多 numpy 向量。我想将它们中的每一个存储在 MySQL 数据库的 BLOB 列中。 I have already read that this is likely not a good idea,但我还是想这样做。为此,我正在尝试创建一个查询。代码如下所示:

query = 'INSERT INTO vectors_table (word_id, vector) VALUES '

for i in vectors:
    query += ({}, {}).format(i.index, i.vector.dumps())

(注意对.dumps()的调用)

替代品

Numpy 数组有一些函数选项可以“序列化”其数据:

我也可以使用泡菜。有一个名为pickle.dumps 的函数也给了我一个bytes 序列。

问题

当我尝试创建查询时,它会在字符串之前插入该死的b。例如,如果我打印我的一个向量,它看起来像:

b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\x00bq\x04X\x06\x00\x00\x00latin1q\x05\x86q\x06Rq\x07\x87q\x08Rq\t(K\x01M\x00\x0c\x85q\ncnumpy\ndtype\nq\x0bX\x02\x00\x00\x00f4q\x0cK\x00K\x01\x87q\rRq\x0e(K\x03X\x01\x00\ ...

不幸的是,从上面的“替代方案”中可以看出,到目前为止我发现的所有替代方案都是如此。

尝试的解决方案

在尝试解决问题时,我发现很多人告诉我使用decode,或cast the bytes into a string

调用.decode('ascii').decode('utf-8') 分别导致UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

尝试将bytes 转换为字符串会创建一个包含“b”的字符串。

有没有更好的方法?

我是 MySQL 的菜鸟,我完全相信我缺少一些明显的解决方案。我已经到了打算用

创建一个字符串的地步
for i in vectors:
    old_str = str(i.vector.dumps())
    new_str = old_str[1:]
    query += ({}, {}).format(i.index, new_str)

然后将其插入到我的查询字符串中。仍然......我不敢相信这是让它工作的唯一方法。

【问题讨论】:

    标签: python mysql numpy pickle


    【解决方案1】:

    最后,我的问题的答案是in this other question。我会在这里回答,以防其他人有类似的问题。

    我在做

    query = 'INSERT INTO vectors_table (word_id, vector) VALUES '
    
    for i in vectors:
        query += "({}, {})".format(i.index, i.vector.dumps())
    

    然后运行cursor.execute(query)

    相反,我应该用%s 编写查询:

    query = 'INSERT INTO vectors_table (word_id, vector) VALUES (%s, %s)'
    

    然后获取我要插入表格的所有元素:

    tuples = [(i.index, i.vector.dumps()) for i in vectors]
    

    并让 MySQL 库处理坏字节的转义:

    cursor.executemany(query, tuples)
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 2013-07-08
      • 1970-01-01
      • 2012-02-08
      • 2023-03-23
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多