【问题标题】:numpy arrays and pymssqlnumpy 数组和 pymssql
【发布时间】:2014-10-20 13:14:45
【问题描述】:

我需要将 numpy 数组存储在 MS SQL 数据库的 varbinary(max) 字段中。在 MySQL 中这是一项简单的任务,但 MS SQL 更复杂。为了能够存储一些东西,我需要像这样弄乱 CONVERT:

db_cursor.execute("INSERT INTO MyTable (AVect, BVect, SomeId) VALUES (CONVERT(varbinary(max), %s), CONVERT(varbinary(max), %s), %s)", (bytes(a_vect), bytes(b_vect), 42))

但是当我跑步时

db_cursor.execute("SELECT AVect FROM MyTable WHERE SomeId=42")

db_cursor.fetchone()['AVect'] 的值为

b'[  0.00000000e+00   1.22070312e-04   2.44140625e-04 ...,   4.99755859e-01\n   4.99877930e-01   5.00000000e-01]'

我假设问题在于我如何使用 CONVERT 但它应该是什么?

【问题讨论】:

  • 我期望的值是 b'\xdbF\xbeT*>\xf8??\xb1M\xd7"\xa8\xc5\xbf\xcf\xfe\xcb3\x0c\x9f\xd4\xbf \x11\x990Nc\xe3\xfc\xbf!:e8X\xb2\xf0?\x15bYn\xfa\xf9\x06@\x00\xba\x04\xcb\xd2\xc6\xf0\xbf=\x03\xf9$\ xa5\x93\xe1?\xed\xb6U\xf7\xae/\xf0\xbf\x14 6I\x9aP\xe2?'

标签: python arrays numpy pymssql


【解决方案1】:

a.tostring() 而不是 bytes(a) 似乎在这里起到了作用。根据 sebix 的回答,也许在某些情况下需要泡菜。

【讨论】:

  • 另外,这是一个 python 版本问题,而不是我想象的 MS vs MySQL 问题。原始代码适用于 Python 3,但对于 Python 2.7,我需要 numpy.tostring。
【解决方案2】:

这是预期的行为。看看bytes(array) 的样子:(在 Legacy Python 2 中)

>>> bytes(np.arange(4))
'[0 1 2 3]'
>>> type(bytes(np.arange(4)))
<type 'str'>

你可以使用pickle.dumps:

>>> import pickle
>>> a = pickle.dumps(np.arange(2))
>>> a
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I2\ntp6\ncnumpy\ndtype\np7\n(S'i8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb."
>>> pickle.loads(a)
array([0, 1])

这会保留构造数组所需的所有信息,包括数据类型、字段名称等。使用产生字符串或字节串的方法,不要保留这些!

【讨论】:

  • 在我的例子中,在 [29]: bytes(np.arange(4)) Out[29]: b'\x00\x00\x00\x00\x00\x00\x00\x00\ x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00' 也许我可以使用泡菜,但这似乎没有必要,因为没有它我正在尝试做的事情在 MySQL 中运行良好。
  • 哦,类型是builtins.bytes
  • 我不知道你想说什么。我的版本不行吗?您使用的字节表示不容易解析。 pickle-version 保留了所有需要的信息,如数据类型等,这是字节字符串无法实现的!
  • Pickle 可能确实有效,但在这种情况下似乎没有必要涉及它。
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 2011-03-30
  • 2021-11-24
  • 2018-06-02
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多