我目前正在寻找一种在数据库中存储类实例的方法,特别是 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>
的内容,我可以对其进行修改并能够检查该实例中过去已修改的任何当前值。
任何帮助就足够了,请提供一些代码以及任何有用的回复:)
提前致谢。
我建议学习对象关系映射库,例如
sqlalchemy
。这不会直接存储实例,而是将实例的字段存储为数据库表中的列。
如果您在 Web 应用程序中执行此操作,
django
会附带一个与 Web 框架交互的 ORM。
为时已晚,但也许它可以帮助其他遇到同样问题的人。
我最近遇到了同样的问题,因为我必须在 SQLite DB 中存储一个类实例(这似乎是一个坏主意,每个人都认为这不是最佳实践,但将类更改为更容易工作的类)对于一个简单的内部应用程序来说,ORM 中的工作量太大了)
我以这篇文章为例:Python SQL:存储对象或可迭代对象,它与可迭代对象执行类似的操作,但我下面的方法适用于类。
import sqlite3
import pickle
class Foo:
def __init__(self):
self.bar = 0
def increment(self):
self.bar += 1
connection = sqlite3.connect('items.db')
connection.execute('CREATE TABLE IF NOT EXISTS DemoTable (id INTEGER PRIMARY KEY AUTOINCREMENT, instance BLOB)')
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()
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