There are some variations in the printed names of exceptions between Oracle and

other database backends, but the exception classes should still be the same.
This commit changes the way the tests check for specific database errors to be
more portable between implementations.

It's possible these tests will still fail if, e.g., Oracle doesn't raise
IntegrityError (but raises DatabaseError) when we except it to, but we can
cross that bridge if and when it appears.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@8450 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-08-20 18:50:06 +00:00
parent 5608dfabc3
commit e94d293504
3 changed files with 27 additions and 15 deletions

View File

@ -2,7 +2,7 @@
Tests for forcing insert and update queries (instead of Django's normal Tests for forcing insert and update queries (instead of Django's normal
automatic behaviour). automatic behaviour).
""" """
from django.db import models, transaction from django.db import models, transaction, IntegrityError
class Counter(models.Model): class Counter(models.Model):
name = models.CharField(max_length = 10) name = models.CharField(max_length = 10)
@ -42,10 +42,14 @@ ValueError: Cannot force an update in save() with no primary key.
# Won't work because we can't insert a pk of the same value. # Won't work because we can't insert a pk of the same value.
>>> sid = transaction.savepoint() >>> sid = transaction.savepoint()
>>> c.value = 5 >>> c.value = 5
>>> c.save(force_insert=True) >>> try:
Traceback (most recent call last): ... c.save(force_insert=True)
... ... except Exception, e:
IntegrityError: ... ... if isinstance(e, IntegrityError):
... print "Pass"
... else:
... print "Fail with %s" % type(e)
Pass
>>> transaction.savepoint_rollback(sid) >>> transaction.savepoint_rollback(sid)
# Trying to update should still fail, even with manual primary keys, if the # Trying to update should still fail, even with manual primary keys, if the

View File

@ -6,7 +6,7 @@ given parameters. If an object isn't found, it creates one with the given
parameters. parameters.
""" """
from django.db import models from django.db import models, IntegrityError
class Person(models.Model): class Person(models.Model):
first_name = models.CharField(max_length=100) first_name = models.CharField(max_length=100)
@ -53,8 +53,12 @@ False
# If you don't specify a value or default value for all required fields, you # If you don't specify a value or default value for all required fields, you
# will get an error. # will get an error.
>>> p, created = Person.objects.get_or_create(first_name='Tom', last_name='Smith') >>> try:
Traceback (most recent call last): ... p, created = Person.objects.get_or_create(first_name='Tom', last_name='Smith')
... ... except Exception, e:
IntegrityError:... ... if isinstance(e, IntegrityError):
... print "Pass"
... else:
... print "Fail with %s" % type(e)
Pass
"""} """}

View File

@ -6,7 +6,7 @@ To define a one-to-one relationship, use ``OneToOneField()``.
In this example, a ``Place`` optionally can be a ``Restaurant``. In this example, a ``Place`` optionally can be a ``Restaurant``.
""" """
from django.db import models, transaction from django.db import models, transaction, IntegrityError
class Place(models.Model): class Place(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
@ -179,10 +179,14 @@ DoesNotExist: Restaurant matching query does not exist.
# This will fail because each one-to-one field must be unique (and link2=o1 was # This will fail because each one-to-one field must be unique (and link2=o1 was
# used for x1, above). # used for x1, above).
>>> sid = transaction.savepoint() >>> sid = transaction.savepoint()
>>> MultiModel(link1=p2, link2=o1, name="x1").save() >>> try:
Traceback (most recent call last): ... MultiModel(link1=p2, link2=o1, name="x1").save()
... ... except Exception, e:
IntegrityError: ... ... if isinstance(e, IntegrityError):
... print "Pass"
... else:
... print "Fail with %s" % type(e)
Pass
>>> transaction.savepoint_rollback(sid) >>> transaction.savepoint_rollback(sid)
"""} """}