Fixed #7572 -- Force the closure of the database connection at the end of fixture loading as a workaround for MySQL bug #37735. Thanks to Simon Litchfield for his help in narrowing down this issue.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@7803 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2008-06-30 12:18:29 +00:00
parent 52b6857f93
commit 9eaa05912c
3 changed files with 116 additions and 0 deletions

View File

@ -162,3 +162,9 @@ class Command(BaseCommand):
else: else:
if verbosity > 0: if verbosity > 0:
print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count) print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count)
# Close the DB connection. This is required as a workaround for an
# edge case in MySQL: if the same connection is used to
# create tables, load data, and query, the query can return
# incorrect results. See Django #7572, MySQL #37735.
connection.close()

View File

@ -0,0 +1,83 @@
[
{
"pk": 6,
"model": "fixtures_regress.channel",
"fields": {
"name": "Business"
}
},
{
"pk": 1,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 1",
"channels": [6]
}
},
{
"pk": 2,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 2",
"channels": [6]
}
},
{
"pk": 3,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 3",
"channels": [6]
}
},
{
"pk": 4,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 4",
"channels": [6]
}
},
{
"pk": 5,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 5",
"channels": [6]
}
},
{
"pk": 6,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 6",
"channels": [6]
}
},
{
"pk": 7,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 7",
"channels": [6]
}
},
{
"pk": 8,
"model": "fixtures_regress.article",
"fields": {
"title": "Article Title 8",
"channels": [6]
}
},
{
"pk": 9,
"model": "fixtures_regress.article",
"fields": {
"title": "Yet Another Article",
"channels": [6]
}
}
]

View File

@ -44,6 +44,16 @@ class Parent(models.Model):
class Child(Parent): class Child(Parent):
data = models.CharField(max_length=10) data = models.CharField(max_length=10)
# Models to regresison check #7572
class Channel(models.Model):
name = models.CharField(max_length=255)
class Article(models.Model):
title = models.CharField(max_length=255)
channels = models.ManyToManyField(Channel)
class Meta:
ordering = ('id',)
__test__ = {'API_TESTS':""" __test__ = {'API_TESTS':"""
>>> from django.core import management >>> from django.core import management
@ -107,4 +117,21 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.)
>>> management.call_command('loaddata', 'model-inheritance.json', verbosity=0) >>> management.call_command('loaddata', 'model-inheritance.json', verbosity=0)
###############################################
# Test for ticket #7572 -- MySQL has a problem if the same connection is
# used to create tables, load data, and then query over that data.
# To compensate, we close the connection after running loaddata.
# This ensures that a new connection is opened when test queries are issued.
>>> management.call_command('loaddata', 'big-fixture.json', verbosity=0)
>>> articles = Article.objects.exclude(id=9)
>>> articles.values_list('id', flat=True)
[1, 2, 3, 4, 5, 6, 7, 8]
# Just for good measure, run the same query again. Under the influence of
# ticket #7572, this will give a different result to the previous call.
>>> articles.values_list('id', flat=True)
[1, 2, 3, 4, 5, 6, 7, 8]
"""} """}