有没有办法将类实例存储到数据库中?蟒蛇

问题描述 投票:0回答:2

我目前正在寻找一种在数据库中存储类实例的方法,特别是 sqlite3 数据库。我知道类实例可以存储在列表中,例如:

class Foo:
    def __init__(self):
        self.foo1 = 0

    def increment(self):
        self.foo1 += 1

foo = Foo()
foo2 = Foo()

foo_list = []

print(foo.foo1) # 0
foo.increment()
print(foo.foo1) # 1

foo_list.append(foo)
foo_list.append(foo2)

print(foo_list) # [<__main__.Foo object at 0x000001A53B3AD4E0>, <__main__.Foo object at 0x000001A53B3AD810>] <- the desired output

但问题是:列表是临时的,因为一旦脚本离线,它们就会被清除——而且我正在使用一个机器人,它很容易在任何给定时刻被删除进行维护;我不想每次关闭机器人进行维护时都继续初始化这些实例。

我希望我的数据库在查询时为我提供类似

<__main__.Foo object at 0x000001A53B3AD4E0>
的内容,我可以对其进行修改并能够检查该实例中过去已修改的任何当前值。

任何帮助就足够了,请提供一些代码以及任何有用的回复:)

提前致谢。

python sqlite
2个回答
0
投票

我建议学习对象关系映射库,例如

sqlalchemy
。这不会直接存储实例,而是将实例的字段存储为数据库表中的列。

如果您在 Web 应用程序中执行此操作,

django
会附带一个与 Web 框架交互的 ORM。


0
投票

为时已晚,但也许它可以帮助其他遇到同样问题的人。

我最近遇到了同样的问题,因为我必须在 SQLite DB 中存储一个类实例(这似乎是一个坏主意,每个人都认为这不是最佳实践,但将类更改为更容易工作的类)对于一个简单的内部应用程序来说,ORM 中的工作量太大了)

我以这篇文章为例:Python SQL:存储对象或可迭代对象,它与可迭代对象执行类似的操作,但我下面的方法适用于类。

  1. 导入所需的库
import sqlite3
import pickle 
  1. 从定义类开始(最简单的部分)
class Foo:
    def __init__(self):
        self.bar = 0

    def increment(self):
        self.bar += 1
  1. 然后打开连接并使用存储实例序列化对象的 BLOB 字段创建数据库
connection = sqlite3.connect('items.db')
connection.execute('CREATE TABLE IF NOT EXISTS DemoTable (id INTEGER PRIMARY KEY AUTOINCREMENT, instance BLOB)')
  1. 最后,创建对象并将其作为序列化对象存储在数据库中
foo_instance = Foo()
foo_instance.increment()
pickled_foo_instance = pickle.dumps(foo_instance)

connection.execute("INSERT INTO DemoTable (instance) VALUES (?)",(sqlite3.Binary(pickled_foo_instance),))

connection.commit()
connection.close()

  1. 要检索对象,请始终确保在实例字段上使用 pickle 加载,因为 python 需要将序列化对象转换回 Foo 类的实例
connection = sqlite3.connect('items.db')
connection.row_factory = sqlite3.Row
item = connection.execute('SELECT * FROM DemoTable WHERE id = ?',("1")).fetchone()
foo_instance = pickle.loads(item["instance"])
print(foo_instance.bar)
connection.close()

这应该将实例永久存储在 sqlite 数据库中。我用同样的逻辑制作了一个烧瓶程序,它工作得非常完美,在这里:https://github.com/rchavelas/flask-for-everybody/tree/main/n.%20Storing%20serialized%20objects%20(class %20个实例)%20到%20SQLite%20db

© www.soinside.com 2019 - 2024. All rights reserved.