学习芹菜,阅读芹菜最佳实践,并有一个关于芹菜的数据库使用的简单问题。
Deni Bertovic说:
您不应该将数据库对象(例如您的用户模型)传递给 背景任务是因为序列化对象可能包含过时 数据。
所以,如果我想连接到一个工人中的数据库,那么正确的选择是什么:
@app.task
def add(x, y, collection):
client = MongoClient('mongodb://localhost:27017/')
db = client.wakawaka
db[collection].insert_one({'sum':x+y})
return True
或:
client = MongoClient('mongodb://localhost:27017/')
db = client.wakawaka
@app.task
def add(x, y, collection):
db[collection].insert_one({'sum':x+y})
return True
?
upd:我可以在每个任务结束时close()
我的mongodb连接,因此每次我需要某些东西时,任务都会连接到新鲜的DB,并且不会浪费资源。不过,我是否需要这么多次打开/关闭数据库连接?或者我可以连接一次并以某种方式刷新连接以检索新鲜版本的DB?
每笔交易的打开/关闭数据库连接使您从独立执行交易的陈旧或不正确数据产生的错误中保存您。同样简化了数据库事务的终身管理。
您可以在连接上下文管理器块中写入交易。此处理可以关闭连接,因此无需明确关闭连接。它也是螺纹安全。当出现异常时,您也可以利用内置连接池进行重试。
@app.task
def add(x, y, collection):
with MongoClient('mongodb://localhost:27017') as connection:
db = connection.db
db.collection.insert_one({'sum':x+y})
return True
请注意,如果您要更新多个文档,这将无法保持数据的交易完整性。
由于MongoDB 4.0.0和Pymongo 3.7,它们开始支持多文件酸交易。