Assume I want to store via sqlite3 a simple list of strings:
my_list = ['a','b','c']
or a python object with properties and methods.
What I tried so far is to serialize (pickle) my_list
, and the returned byte representation is b'x80x03]qx00(Xx01x00x00x00aqx01Xx01x00x00x00bqx02Xx01x00x00x00cqx03e.'
. However, cannot be stored within a BLOB variable.
Should I use a string variable instead, or should I find a way to convert the serialized object into a different format to get rid of the before storing?
Note that I’m learning SQL and the fundamentals of data conversion.
Advertisement
Answer
Take a look into how to serialize the data. Storing complex objects into a relational database (sqlite) is not easy. I suggest saving the data as a json string or perhaps in a JSONField.
May I ask, how are you accessing the sqlite? (eg. sqlite module, via django models, flask or other)
You can take this code as a reference (I am using sqlite3 module).
It think you might have missed 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())