numpy数组与pymssql

1 投票
2 回答
624 浏览
提问于 2025-04-28 13:30

我需要把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的方式上,那我应该怎么做呢?

暂无标签

2 个回答

1

这是正常的行为。看看在旧版Python 2中,bytes(array)的表现:

>>> 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])

这样可以保留构建你数组所需的所有信息,包括数据类型、字段名称等等。使用返回字符串或字节字符串的方法,无法保留这些信息!

1

这里用 a.tostring() 而不是 bytes(a) 似乎能解决问题。不过,根据 sebix 的回答,可能在某些情况下还是需要用到 pickle。

撰写回答