Django ORM 未存储在 try/except 块内
Django ORM not storing inside try/except block
我对 Django 存储对象有疑问。当我尝试在 try/except 块内做某事时,如果一切正常,我的对象将被保留。但如果引发异常(不是因为对象的 .save()),则不会存储任何内容。
一个例子:
def my_function(raise_exc):
MyModel.objects.create(name='name')
if raise_exc:
raise Exception()
return
成功案例:
raise_exc = False
try:
my_function(raise_exc=raise_exc)
except Exception:
pass
KO 案例:
raise_exc = True
try:
my_function(raise_exc=raise_exc)
except Exception:
pass
只有在 OK 情况下,MyModel 对象才会被持久化。通过调试,我可以看到,在这两种情况下,对象都是在 RAM 内存中创建的(MyModel.objects.all() 包含它),但不在数据库中。如果引发异常,看起来它会进行事务回滚(我没有使用事务块。以防万一)。
我不知道这是否是 ORM 所期望的行为。如果是,即使在保存对象后引发异常,我该怎么做才能将对象存储在 try 块中? (假设我不应该删除那个 try/except 包装器)
如果 ATOMIC_REQUESTS 在 settings.py
的数据库定义中设置为 TRUE,则这是默认行为
原子请求的文档状态:
Before calling a view function, Django starts a transaction. If the
response is produced without problems, Django commits the transaction.
If the view produces an exception, Django rolls back the transaction]1
DATABASES = {
'default': {
'ENGINE': '',
'NAME': '',
'USER': '',
'PASSWORD': '!',
'HOST': '127.0.0.1', # Or an IP Address that your DB is hosted on
'PORT': '',
'ATOMIC_REQUESTS': True
}
}
如果您想在代码引发异常时保留数据库事务,请将 ATOMIC_REQUESTS 设置为 False。
我对 Django 存储对象有疑问。当我尝试在 try/except 块内做某事时,如果一切正常,我的对象将被保留。但如果引发异常(不是因为对象的 .save()),则不会存储任何内容。
一个例子:
def my_function(raise_exc):
MyModel.objects.create(name='name')
if raise_exc:
raise Exception()
return
成功案例:
raise_exc = False
try:
my_function(raise_exc=raise_exc)
except Exception:
pass
KO 案例:
raise_exc = True
try:
my_function(raise_exc=raise_exc)
except Exception:
pass
只有在 OK 情况下,MyModel 对象才会被持久化。通过调试,我可以看到,在这两种情况下,对象都是在 RAM 内存中创建的(MyModel.objects.all() 包含它),但不在数据库中。如果引发异常,看起来它会进行事务回滚(我没有使用事务块。以防万一)。
我不知道这是否是 ORM 所期望的行为。如果是,即使在保存对象后引发异常,我该怎么做才能将对象存储在 try 块中? (假设我不应该删除那个 try/except 包装器)
如果 ATOMIC_REQUESTS 在 settings.py
的数据库定义中设置为 TRUE,则这是默认行为原子请求的文档状态:
Before calling a view function, Django starts a transaction. If the response is produced without problems, Django commits the transaction. If the view produces an exception, Django rolls back the transaction]1
DATABASES = {
'default': {
'ENGINE': '',
'NAME': '',
'USER': '',
'PASSWORD': '!',
'HOST': '127.0.0.1', # Or an IP Address that your DB is hosted on
'PORT': '',
'ATOMIC_REQUESTS': True
}
}
如果您想在代码引发异常时保留数据库事务,请将 ATOMIC_REQUESTS 设置为 False。