Python SQL:存储对象或可迭代对象

Posted

技术标签:

【中文标题】Python SQL:存储对象或可迭代对象【英文标题】:Python SQL: storing objects or iterables 【发布时间】:2021-11-14 22:30:15 【问题描述】:

假设我想通过 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 和数据转换的基础知识。

【问题讨论】:

\ 不是字节串的一部分;当您打印出来时会介绍它们 另外,一个blob绝对可以存储\ ;如果遇到问题,您可能在运行 SQL 语句时错过了占位符和参数的使用 【参考方案1】:

看看如何序列化数据。 将复杂对象存储到关系数据库 (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.Binary的目的是什么? bytes实例可以直接保存。

以上是关于Python SQL:存储对象或可迭代对象的主要内容,如果未能解决你的问题,请参考以下文章

Python内置函数——最值与求和

条件循环及其它语句

Python之容器迭代器生成器

搞清楚 Python 的迭代器可迭代对象生成器

搞清楚 Python 的迭代器可迭代对象生成器

python当中的 可迭代对象 迭代器