MySQL:Django.create后跟.get在没有重新打开sh的情况下无法工作

2024-09-30 03:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

>>> Anything.objects.create(title='test')
<Anything: test>
>>> Anything.objects.get(title='test')
DoesNotExist: Anything matching query does not exist.
>>> exit()

。。。重新打开shell。。。你知道吗

>>> Anything.objects.get(title='test')
<Anything: test>

超级难堪。运行Python 2.7.3;Django 1.5.4;MySQL 5.5(innodb),Ubuntu 12.04。你知道吗

此外,首先打开pythonshell,然后对mysql运行insert语句,会导致类似的情况,即数据库中存在记录,但shell找不到它。你知道吗

转储mysql日志显示了您所期望的:一个insert语句,后跟一个select;它似乎在某种程度上与数据库的一个过时版本相冲突——这个版本似乎是在shell实例的开头建立的!你知道吗

直接对数据库运行顺序insert和select语句会产生类似的结果;因为shell是实例化的,所以无法访问新信息。你知道吗

仍在追查:

>>> t = TagManager.objects.create(title='test')
>>> t
<TagManager: test>
>>> t.id
1L
>>> TagManager.objects.get(title='test')
<TagManager: test>
>>> t2 = TagManager.objects.create(title='test2')
>>> TagManager.objects.get(title='test2')
DoesNotExist: TagManager matching query does not exist.
>>> t2.id
2L
>>> TagManager.objects.get(title='test2')
DoesNotExist: TagManager matching query does not exist.
>>> TagManager.objects.get(title='test')
<TagManager: test>

退出shell。。。你知道吗

>>> TagManager.objects.get(title='test2')
<TagManager: test2>
>>> TagManager.objects.create(title='test3')
<TagManager: test3>
>>> t.id
3L
>>> TagManager.objects.get(title='test3')
DoesNotExist: TagManager matching query does not exist.
>>> t = TagManager.objects.create(title='test4')
>>> t
<TagManager: test4>
>>> t.id
4L
>>> TagManager.objects.get(title='test4')
DoesNotExist: TagManager matching query does not exist.

Tags: testgetobjectstitlecreatenotshellquery
2条回答

有没有可能任何东西。物体指向未按预期方式运行的管理器实例(通过在create方法中保存对象)?你知道吗

如果不是,那么我希望您的shell在一个没有提交的事务中运行。你也许会明白

django.db.transaction.commit_unless_managed()

在调用create()之后执行。你知道吗

原来这是由于MySQL中默认的可重复读取事务隔离级别造成的

http://django.readthedocs.org/en/latest/topics/db/transactions.html#using-a-high-isolation-level

将mysql conf中的事务隔离级别更改为READ COMMITTED可以解决这个问题。你知道吗

相关问题 更多 >

    热门问题