用户表中的外键已保存但立即回滚

时间:2014-08-04 18:33:00

标签: python mysql django orm

我有一个非常奇怪的问题,我现在已经好几天了。

支持会发生什么:用户点击一个URL /视图,该视图具有在我的Payments表中创建新对象的逻辑,然后立即将其保存为外键我的用户表。返回视图的HttpResponse并保留外键(当然)。

ACTUALLY 会发生什么:外键保存没有问题,但一旦功能执行结束就会被删除(特别是从视图返回HttpResponse时)。用户表的外键变为" NULL"在MySQL数据库中。

-

有什么可能的原因?看起来在这里会触发某种类型的回滚。我有一些想法(比如检查自定义中间件),但那些没有产生任何结果。

其他一些警告:

  • 我已尝试更新同一事务中的文本字段,并且在HttpResponse之后也会回滚。所以我们知道它不仅仅是被取消的外键。
  • 当我进入django shell并复制视图的逻辑(创建一个新的Payment对象,然后将其保存为User表的外键)时,它会永久保存外键而不会出现任何问题或回滚!所以我们知道它并不是与函数逻辑直接相关的东西。
  • 我尝试使用超级用户帐户登录我的网站时通过浏览器访问该网址,但这并没有改变任何内容。我认为这意味着它不是一个权限问题,但并不完全确定。

非常感谢任何想法/想法:(

更新:这是我的代码缩短的重新创建:

class CapturePayment(View):
  def get(self, request, auth_id, user_id):
    pmt = Payment.objects.get(id=auth_id) // get the payment object that was successfully made in prev function
    usr = User.objects.get(id=user_id)
    usr.payment_fk = pmt  // also have tried "usr.payment_fk_id = pmt.id"
    usr.save()

    // here I do another lookup on the same user to see if this object saved.
    check_usr = User.objects.get(id=user_id)
    logger.info(check_usr.payment_fk) // shows up in the log with the correct payment object

    // HttpResponse returns, but upon checking MySQL database the foreign key is replaced with "NULL" again
    return HttpResponse(something) 

1 个答案:

答案 0 :(得分:0)

完成后提交交易!

检查AUTOCOMMIT是否设置为FALSE ..根据link in the comments ..

  

通过在其配置中将AUTOCOMMIT设置为False,您可以完全禁用给定数据库的Django事务管理。如果你这样做,Django将不会启用自动提交,并且不会执行任何提交。您将获得底层数据库库的常规行为。

您可能还需要在MySQL中查看此内容。

SHOW GLOBAL VARIABLES WHERE variable_name = 'autocommit';