gpt4 book ai didi

python - 如何将动态数据库名称传递给装饰器?

转载 作者:行者123 更新时间:2023-11-28 18:53:01 24 4
gpt4 key购买 nike

Django 有一个名为@transaction.commit_manually 的装饰函数。我试图将一个参数传递给这个装饰器,(using=db)db 根据业务规则根据所使用的数据库而变化。将当前数据库传递给这个装饰器的最佳方式是什么?我尝试使用内部函数,因此:

def func(db):
stuff = _business logic_

@transaction.commit_manually(using=db)
def do_transaction(stuff):
try:
stuff.save(using=db)
except:
transaction.rollback()
else:
transaction.commit()

do_transaction()

然而,这失败了。我在 pdb 中发现的错误是内部 block “不在事务管理下”。我该如何克服这个问题?

来自 pdb 的回溯:

-> success = transactional_registration()
/usr/local/lib/python2.7/dist-packages/django/db/transaction.py(338)_commit_manually()
-> return func(*args, **kw)
> /home/syrion/dev/registration.py(59)transactional_registration()
-> transaction.rollback()
/usr/local/lib/python2.7/dist-packages/django/db/transaction.py(210)rollback()
-> set_clean(using=using)
/usr/local/lib/python2.7/dist-packages/django/db/transaction.py(125)set_clean()
-> raise TransactionManagementError("This code isn't under transaction management"

编辑:我解决了我自己的问题。内部函数解决方案工作正常,但我需要使用 using 参数调用 rollback()commit(),即 transaction.commit(using=db ),以及。我发现这不直观,但是......

最佳答案

我在我的代码中经常使用它,因为我对 ORM 施加了很大的压力。由于我不太喜欢装饰器语法,所以我使用了 with 语句。

def do_transaction(stuff, db):
with transaction.commit_manually(using=db)
try:
stuff.save(using=db)
except:
transaction.rollback()
else:
transaction.commit(using=db)

这应该有效。不过,不确定您是否需要在 transaction.rollback() 中使用 (using=db)。我相信您可以对此进行研究。但是您确实需要在 transaction.commit(using=db) 中使用 (using=db)

关于python - 如何将动态数据库名称传递给装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com