我做了一件愚蠢的事情,忘记将一些值明确转换为SQLite数据库中要存储的INT
类型(使用Python的SQLalchemy)。该列应设置为存储一个INT
,而实际输入是numpy.int64
dtype。
从数据库中取回的值如下:
b'\x15\x00\x00\x00\x00\x00\x00\x00'
看起来SQLite已经存储了这些值的二进制表示,而不是整数本身。
有没有办法在Python中解码这些值,或者我必须重新加载所有数据(这并不是一个微不足道的练习)?
我做了一件愚蠢的事情,忘记将一些值明确转换为SQLite数据库中要存储的INT
类型(使用Python的SQLalchemy)。该列应设置为存储一个INT
,而实际输入是numpy.int64
dtype。
从数据库中取回的值如下:
b'\x15\x00\x00\x00\x00\x00\x00\x00'
看起来SQLite已经存储了这些值的二进制表示,而不是整数本身。
有没有办法在Python中解码这些值,或者我必须重新加载所有数据(这并不是一个微不足道的练习)?
struct.unpack()
:>>> import struct
>>> value = struct.unpack('<q', b'\x15\x00\x00\x00\x00\x00\x00\x00')
>>> value
(21,)
>>> value[0]
21
这假设数据是按照unpack()
格式字符串中的<
指定的小端顺序存储的,并且它是一个带符号的“long long”(8个字节),如q
所指定的那样。如果数据是大端的:
>>> struct.unpack('>q', b'\x15\x00\x00\x00\x00\x00\x00\x00')
(1513209474796486656,)
我认为在这种情况下,小端序更有可能是正确的。
补充:我刚刚证实,当一个numpy.int64
插入到SQLite的int
字段中时,可以像上面显示的那样使用struct.unpack()
进行检索。