1

Django(版本 1.1.4 值得)任意找不到我的一个数据库表中的项目。有问题的对象管理器是默认的。下面是两个示例,第一个显示问题的范围,第二个提供了它的特定实例。

姜戈:

In [5]: LocalStore.objects.all().count()
Out[5]: 1466

MySQL:

mysql> select count(*) from stores_localstore;
+----------+
| count(*) |
+----------+
|     1553 | 
+----------+
1 row in set (0.00 sec)

本身就够奇怪了。现在这是一个在数据库中但未显示的单个对象的示例:

姜戈:

In [37]: LocalStore.objects.filter(id=474361)
Out[37]: []
In [39]: print LocalStore.objects.filter(id=474361).query
SELECT `stores_localstore`.`id`, `stores_localstore`.`cust_id`,
`stores_localstore`.`name`, `stores_localstore`.`lat`, `stores_localstore`.`lng`,
`stores_localstore`.`addr1`, `stores_localstore`.`addr2`, `stores_localstore`.`city`, 
`stores_localstore`.`email`, `stores_localstore`.`fax`, `stores_localstore`.`phone`, 
`stores_localstore`.`state`, `stores_localstore`.`url`, `stores_localstore`.`zip` FROM
`stores_localstore` WHERE `stores_localstore`.`id` = 474361 

出于隐私原因,我不想向您展示 MySQL 查询的确切结果,但只要说它确实返回了数据库行就足够了。

这让我觉得这是一个非常奇怪的行为,并且可能是 Django ORM 内部深处的一个错误。但也有可能我忽略了一些明显的东西。那会是什么?

4

2 回答 2

1

Django 正在查看与您连接的数据库不同的数据库,或者您已经告诉 django 以某种方式进行缓存。Django 不会“丢失”数据。

验证 django 是否连接到正确的数据库:

from django import db
db.settings.DATABASES.get('default')
于 2012-05-17T12:27:45.610 回答
0

可能您的 MySQL 的隔离级别是REPEATEABLE READ(这是 innodb 的默认值),并且 Django shell 中的 DB 连接在新插入行之前处于事务中(由手动事务管理或使用某些连接池引起,等)并且仍然保存旧行的过期快照。
然后你体验了幻读。

于 2012-05-17T13:13:11.147 回答