gpt4 book ai didi

python - 使用多数据库的 Django 事务

转载 作者:行者123 更新时间:2023-12-01 04:34:41 26 4
gpt4 key购买 nike

我有三个数据库,我想根据一个请求在事务中向它们添加数据。

例如我的代码。

@transaction.commit_manually
def my_view(request):
try:
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)
except IntegrityError:
transaction.rollback()
transaction.rollback(using='db_one')
transaction.rollback(using='db_two')
return ...
transaction.commit()
transaction.commit(using='db_one')
transaction.commit(using='db_two')
return ...

结果:

  1. MyModel_one — 数据未保存
  2. MyModel_two — 数据已保存(我不明白为什么)
  3. MyModel_ Three — 数据未保存,因为希望错误

问题:为什么交易在这里不起作用?我该怎么做才能获得工作交易?

(我尝试使用其他方法但没有成功)(我也知道这不是漂亮的代码,但对于理解问题来说非常简单)

Django 1.7.7Python 2.7

数据库:默认值——postgresdb_one — mysqldb_two — mysql

最佳答案

transaction.commit_manually装饰器was deprecated在 Django 1.6 中。您应该切换到 Django 新的事务管理。

我认为你不需要手动提交事务,你可以嵌套transaction.atomic .

def my_view(request):
try:
with transaction.atomic(using='default'):
with transaction.atomic(using='db_one'):
with transaction.atomic(using='db_two'):
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # raises exception
except IntegrityError:
return ...
return ...

关于python - 使用多数据库的 Django 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928143/

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