Python 使用pyodbc将pickle对象插入数据库

Python 使用pyodbc将pickle对象插入数据库,python,blob,pickle,pyodbc,Python,Blob,Pickle,Pyodbc,我尝试了以下方法,但无效: keypoints_database = pickle.load( open( "5958.p", "rb" ) ) sql = 'INSERT INTO tb_fpdata (Std_SymbolNo , FP_Descriptors) VALUES (5958 , ?)' , pyodbc.Binary(keypoints_database) 我得到了以下错误: 如何将对象保存到数据库中?因此您有一个包含pickle对象的二进制文件。文件的十六进制转储如下所示

我尝试了以下方法,但无效:

keypoints_database = pickle.load( open( "5958.p", "rb" ) )

sql = 'INSERT INTO tb_fpdata (Std_SymbolNo , FP_Descriptors) VALUES (5958 , ?)' , pyodbc.Binary(keypoints_database)
我得到了以下错误:


如何将对象保存到数据库中?

因此您有一个包含pickle对象的二进制文件。文件的十六进制转储如下所示:

00000000:80049515 0000 0000 0000 007d 9428 8c03………..]。。。 00000010:666f 6f94 4b01 8c03 6261 7294 4b02 752e foo.K..bar.K.u。 您可以将对象保存到二进制列,然后将其读回并通过pickle.loads取消pickle,如下所示:

导入pyodbc 进口泡菜 连接线= r'DRIVER=SQL Server的ODBC驱动程序17;' r'SERVER=。\SQLEXPRESS;' r'DATABASE=myDb;' r'Trusted_Connection=yes;' cnxn=pyodbc.connectconn_str,autocommit=True crsr=cnxn.cursor crsr.executeCREATE表测试id INT主键,pkl VARBINARYmax 从文件中读取预pickle对象并保存到表中 使用openr'C:\Users\Gord\Desktop\data.pickle、'rb'作为f: sql=插入测试id,pkl值? 参数=1,f.read crsr.executesql,参数 从数据库中读回并取消勾选 pickled_data=crsr.execute从测试中选择pkl,其中id=1.fetchval unpickled_object=pickle.loadspickled_数据 printunpickled_对象 {'foo':1,'bar':2}
如果您已经有一个包含序列化pickle对象的文件,那么为什么不将该文件作为字节流读取,然后将该字节流写入二进制列(例如VARBINARYmax)?我能够将二进制流写入数据库。现在我想检索二进制流并将其转换回pickle对象。有没有办法??这个例子是针对Python2还是Python3的?对于Python3和MySQL,这种方法会导致SQL语法出现错误;请查看与MySQL服务器版本对应的手册,以了解在第5 1064行SQLParamData的“xx\x81L\x0f”附近使用的正确语法。我认为这是由于处理二进制字符串的差异造成的?@bluenote10-我相当肯定,这将适用于python3;我很久以前就开始避免使用Python 2了。我刚刚在Python 3.8中使用pyodbc版本4.0.30和myodbc8a.dll版本08.00.0018对MySQL 5.6.13服务器进行了测试,效果很好。感谢您的澄清。问题似乎与插入中存在的二进制和/或其他值的实际内容和/或长度有关。我仍然需要缩小问题的范围,但这可能是pyodbc或MySQL ODBC驱动程序中的问题。无论如何,我可以确认该示例在理论上适用于Python3。