有人可以推荐一个模块或者告诉我如何获取Python的对象数据库吗?
我对保存对象的数据库感兴趣的原因之一是因为我认为数据库可以提供比使用pickle
更简单的代码。
在我的问题Saving an Object (Data persistence)中,有人使用pickle
向我提供了一段代码,我认为应该有一种更简单的方法来保存对象。
答案 0 :(得分:4)
如果代码的简单性是您主要关注的问题,pickle
很难被击败。
基本上,为了保存对象data
,您所要做的就是:
with open('data.pickle', 'w') as pickle_file:
pickle.dump(data, pickle_file)
然后您可以通过以下方式取回:
with open('data.pickle') as pickle_file:
data = pickle.load(pickle_file) # You get the data back!
如果您需要保存自己的类中的对象,可能需要查看some technical details,但将对象保存到文件基本上与编写/阅读上面的代码!
答案 1 :(得分:3)
这是一个非常模糊的领域,因为你没有告诉你的要求是什么。根据您的具体需求,有不同的可能性。您可以在python index中搜索与数据库相关的产品。
我会使用pickle或json将对象存储并加载到磁盘上的单个文件中。
python有很多Object relational mappers可用
python有一些“纯对象”数据库,如zope或cog(不,我没有任何经验)。
修改强>
由于您明确表示您想要一个简单的解决方案,我希望第二个@EOL pickle
是要使用的工具。
答案 2 :(得分:3)
ZODB是一个出色的对象数据库。设置需要一些工作,但这完全是值得的。
Pickle不是数据库,因此可以用来加载或保存数据,但不能将它们用作数据库,只能用作保存文件格式。
Shelve是一个原始的密钥数据存储。即,如果所有对象都有唯一键,则可以使用它,否则不能。
答案 3 :(得分:2)
以下是使用shelve
模块的示例(我在评论中错误地将shelf
模块称为Rudi的答案)。这是my answer之后的另一个问题的图案,因此您可以轻松地将其与使用其他答案中显示的pickle
模块进行比较。
注意如何以不同的顺序检索对象,这些顺序与它们在数据库文件中的放置方式无关(由于架子中只有两个对象,因此恰好与该顺序相反)。
import shelve
class Company:
def __init__(self, name, value):
self.name = name
self.value = value
comp_db = shelve.open('company_database', 'n')
comp_db['company1'] = Company('banana', 40)
comp_db['company2'] = Company('spam', 42)
# update entry
a_company = comp_db['company1']
a_company.name = 'egg' # change name
comp_db['company1'] = a_company # update db
comp_db.close()
comp_db = shelve.open('company_database')
company2 = comp_db['company2']
print company2.name
# spam
print company2.value
# 42
company1 = comp_db['company1']
print company1.name
# egg
print company1.value
# 40
comp_db.close()