numpy数组与pymssql
我需要把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。