diff options
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/core/management.py | 9 | ||||
| -rw-r--r-- | django/db/backends/mysql/base.py | 12 |
3 files changed, 21 insertions, 1 deletions
@@ -119,6 +119,7 @@ answer newbie questions, and generally made Django that much better: Eric Moritz <http://eric.themoritzfamily.com/> Robin Munn <http://www.geekforgod.com/> Nebojša Dorđević + Fraser Nevett <mail@nevett.org> Sam Newman <http://www.magpiebrain.com/> Neal Norwitz <nnorwitz@google.com> oggie rob <oz.robharvey@gmail.com> diff --git a/django/core/management.py b/django/core/management.py index bcfcd60617..4fa40b5807 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -820,7 +820,8 @@ def get_validation_errors(outfile, app=None): validates all models of all installed apps. Writes errors, if any, to outfile. Returns number of errors. """ - from django.db import models + from django.conf import settings + from django.db import models, connection from django.db.models.loading import get_app_errors from django.db.models.fields.related import RelatedObject @@ -862,6 +863,12 @@ def get_validation_errors(outfile, app=None): if f.db_index not in (None, True, False): e.add(opts, '"%s": "db_index" should be either None, True or False.' % f.name) + # Check that maxlength <= 255 if using older MySQL versions. + if settings.DATABASE_ENGINE == 'mysql': + db_version = connection.get_server_version() + if db_version < (5, 0, 3) and isinstance(f, (models.CharField, models.CommaSeparatedIntegerField, models.SlugField)) and f.maxlength > 255: + e.add(opts, '"%s": %s cannot have a "maxlength" greater than 255 when you are using a version of MySQL prior to 5.0.3 (you are using %s).' % (f.name, f.__class__.__name__, '.'.join(str(n) for n in db_version[:3]))) + # Check to see if the related field will clash with any # existing fields, m2m fields, m2m related objects or related objects if f.rel: diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 23ea76316f..e266ad9101 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -13,6 +13,7 @@ except ImportError, e: from MySQLdb.converters import conversions from MySQLdb.constants import FIELD_TYPE import types +import re DatabaseError = Database.DatabaseError @@ -24,6 +25,8 @@ django_conversions.update({ FIELD_TYPE.TIME: util.typecast_time, }) +server_version_re = re.compile('[.-]') + # This is an extra debug layer over MySQL queries, to display warnings. # It's only used when DEBUG=True. class MysqlDebugWrapper: @@ -61,6 +64,7 @@ class DatabaseWrapper(local): def __init__(self): self.connection = None self.queries = [] + self.server_version = None def _valid_connection(self): if self.connection is not None: @@ -110,6 +114,14 @@ class DatabaseWrapper(local): self.connection.close() self.connection = None + def get_server_version(self): + if not self.server_version: + if not self._valid_connection(): + self.cursor() + version = server_version_re.split(self.connection.get_server_info()) + self.server_version = tuple([int(x) for x in version[:3]]) + tuple(version[3:]) + return self.server_version + supports_constraints = True def quote_name(name): |
