Django(版本1.1.4,它的价值)是任意找不到我的数据库表中的项目。有问题的对象管理器是默认的。接下来是两个例子,第一个显示问题的范围,第二个提供它的特定实例。
Django的:
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)
本身很奇怪。现在这里是一个在DB中但没有出现的单个对象的例子:
Django的:
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内部深处的一个错误。但也有可能我忽略了一些显而易见的事情。那可能是什么?
答案 0 :(得分:1)
Django正在查看与您连接的数据库不同的数据库,或者您告诉django以某种方式缓存。 Django不会“丢失”数据。
验证django是否连接到正确的数据库:
from django import db
db.settings.DATABASES.get('default')
答案 1 :(得分:0)
你的MySQL的隔离级别可能是REPEATEABLE READ(这是innodb的默认值),并且Django shell中的数据库连接比新插入的行更早处于事务中(由手动事务管理或使用引起)某些连接池等)并且仍保留旧行的过期快照 然后你经历了幻读。