私はdjango 1.3.1、python2.6、およびMySQL 5.5.20を持っています。
init_command
setting.py で に設定されていSET storage_engine=INNODB
ます。
次のような状況があります。
モデルを考えてみましょう:
class Fruit(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
ここで、2 つの Django シェルを開き、次のように入力します。
ジャンゴシェルI:
./manage.py shell
(InteractiveConsole)
>>> import fruits.models as m
>>> m.Fruit(name="apple").save()
>>> m.Fruit.objects.get(pk=1)
<Fruit: apple>
ジャンゴシェル II:
./manage.py shell
(InteractiveConsole)
>>> import fruits.models as m
>>> m.Fruit.objects.get(pk=1)
<Fruit: apple>
ここまでは順調ですね。次に、シェル Iを入力し続けます。
>>> m.Fruit(name="peach").save()
>>> m.Fruit.objects.get(pk=2)
<Fruit: peach>
Qestion: シェル II で次のように入力してもオブジェクトが見つからないのはなぜですか?
>>> m.Fruit.objects.get(pk=2)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "..../django/db/models/manager.py", line 132, in get
return self.get_query_set().get(*args, **kwargs)
File "..../django/db/models/query.py", line 349, in get
% self.model._meta.object_name)
DoesNotExist: Fruit matching query does not exist.
シェル II を「新鮮な外観」にする唯一の方法は次のとおりです。
>>> from django.db import transaction
>>> transaction.enter_transaction_management()
>>> transaction.rollback()
そしてroolback()
、orm が「嘘をつかない」ことを確認したい場合は、毎回果物を照会する必要があります。