Python SQL: 存储对象或可迭代对象
Python SQL: storing objects or iterables
假设我想通过 sqlite3 存储一个简单的字符串列表:
my_list = ['a','b','c']
或具有属性和方法的 python 对象。
到目前为止我尝试的是序列化(pickle)my_list
,返回的字节表示是b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
。但是,\
不能存储在 BLOB 变量中。
我应该改用字符串变量,还是应该找到一种方法将序列化对象转换为不同的格式以在存储前去掉 \
?
请注意,我正在学习 SQL 和数据转换的基础知识。
查看如何序列化数据。
将复杂对象存储到关系数据库 (sqlite) 中并不容易。
我建议将数据保存为 json 字符串或者可能保存在 JSONField 中。
请问,您是如何访问sqlite的? (例如,sqlite 模块,通过 django 模型、flask 或其他)
您可以将此代码作为参考(我使用的是sqlite3模块)。
它认为你可能错过了 sqlite3.Binary(binary_obj)
import sqlite3
import sqlite3
import pickle
def store_in_db(obj):
binary_obj = pickle.dumps(obj)
print('binary_obj: ', binary_obj)
conn = sqlite3.connect('demo.db')
conn.execute('CREATE TABLE IF NOT EXISTS DemoTable (binary_field BLOB)')
conn.execute('INSERT INTO DemoTable VALUES(?)', [sqlite3.Binary(binary_obj)])
conn.commit()
conn.close()
def retrieve_from_db():
conn = sqlite3.connect('demo.db')
row = conn.execute('SELECT * FROM DemoTable').fetchone()
obj = pickle.loads(row[0])
conn.close()
return obj
my_list = ['a', 'b', 'c']
store_in_db(my_list)
print(retrieve_from_db())
假设我想通过 sqlite3 存储一个简单的字符串列表:
my_list = ['a','b','c']
或具有属性和方法的 python 对象。
到目前为止我尝试的是序列化(pickle)my_list
,返回的字节表示是b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
。但是,\
不能存储在 BLOB 变量中。
我应该改用字符串变量,还是应该找到一种方法将序列化对象转换为不同的格式以在存储前去掉 \
?
请注意,我正在学习 SQL 和数据转换的基础知识。
查看如何序列化数据。 将复杂对象存储到关系数据库 (sqlite) 中并不容易。 我建议将数据保存为 json 字符串或者可能保存在 JSONField 中。
请问,您是如何访问sqlite的? (例如,sqlite 模块,通过 django 模型、flask 或其他)
您可以将此代码作为参考(我使用的是sqlite3模块)。
它认为你可能错过了 sqlite3.Binary(binary_obj)
import sqlite3
import sqlite3
import pickle
def store_in_db(obj):
binary_obj = pickle.dumps(obj)
print('binary_obj: ', binary_obj)
conn = sqlite3.connect('demo.db')
conn.execute('CREATE TABLE IF NOT EXISTS DemoTable (binary_field BLOB)')
conn.execute('INSERT INTO DemoTable VALUES(?)', [sqlite3.Binary(binary_obj)])
conn.commit()
conn.close()
def retrieve_from_db():
conn = sqlite3.connect('demo.db')
row = conn.execute('SELECT * FROM DemoTable').fetchone()
obj = pickle.loads(row[0])
conn.close()
return obj
my_list = ['a', 'b', 'c']
store_in_db(my_list)
print(retrieve_from_db())