json 使用python将压缩字符串存储到sqlite数据库中

u2nhd7ah  于 5个月前  发布在  Python
关注(0)|答案(2)|浏览(89)

我尝试在我的sqlite数据库中存储压缩字典。首先,我使用json.dumps将dict转换为字符串,这似乎工作正常。将此字符串存储在DB中也可以。
在下一步中,我将使用encode("zlib")压缩字符串。但是将结果字符串存储在数据库中会抛出一个错误。

mydict = {"house":"Haus","cat":"Katze","red":u'W\xe4yn',"dict":{"1":"asdfhgjl ahsugoh ","2":"s dhgsuoadhu gohsuohgsduohg"}}
dbCommand("create table testTable (ch1 varchar);")
# convert dictionary to string
jch1 = json.dumps(mydict,ensure_ascii=True)
print(jch1)
# store uncompressed values
dbCommand("insert into testTable (ch1) values ('%s');"%(jch1))
# compress json strings
cjch1 = jch1.encode("zlib")
print(cjch1)
# store compressed values
dbCommand("insert into testTable (ch1) values ('%s');"%(cjch1))

字符串
第一次打印输出:

{"house": "Haus", "dict": {"1": "asdfhgjl ahsugoh ", "2": "s dhgsuoadhu gohsuohgsduohg"}, "red": "W\u00e4yn", "cat": "Katze"}


第二个印刷品当然是不可读的:

xワフ1テPCᆵyfᅠネノ õ


在此之前,我是否需要进行任何额外的转换?
期待任何帮助提示!

7fyelxc5

7fyelxc51#

让我们从后面来讨论这个问题:为什么首先要使用gzip编码?您认为需要在数据库中保存空间吗?您检查过字典字符串在生产环境中的长度吗?在压缩实际上保存存储空间之前,这些字符串需要具有最小长度(对于小的输入字符串,输出甚至可能比输入更大!)。如果这实际上节省了一些磁盘空间:你是否考虑过由于gzip编码和解码而增加的CPU负载和处理时间是否值得节省的空间?
除此之外:gzip/zlib压缩的结果是一个二进制blob。在Python 2中,这应该是str类型。在Python 3中,这应该是bytes类型。在任何情况下,数据库都需要知道,无论你存储的是 * 二进制数据 *!VARCHAR不是正确的数据类型。下面是MySQL文档的引用:
此外,如果要存储可能包含任意字节值的二进制值(如加密或压缩函数的结果),请使用BLOB列而不是CHAR或VARCHAR列,以避免删除尾随空格可能会更改数据值的潜在问题。
同样的考虑也适用于其他数据库。同样在SQLite的情况下,你必须使用BLOB数据类型(参见docs)来存储二进制数据(如果你想确保取回与之前输入的数据完全相同的数据:-))。

flvlnr44

flvlnr442#

非常感谢简-菲利普,
你向我展示了正确的解决方案。我的表需要有一个BLOB条目来存储数据。下面是工作代码:

mydict = {"house":"Haus","cat":"Katze","red":u'W\xe4yn',"dict":{"1":"asdfhgjl ahsugoh ","2":"s dhgsuoadhu gohsuohgsduohg"}}
curs.execute("create table testTable (ch1 BLOB);")
# convert dictionary to string
jch1 = json.dumps(mydict,ensure_ascii=True)
cjch1 = jch1.encode("zlib")
# store compressed values
curs.execute('insert into testTable values (?);', [buffer(cjch1)])
db.commit()

字符串

相关问题