diff --git a/AUTHORS b/AUTHORS index 225335abfd..286fdd2437 100644 --- a/AUTHORS +++ b/AUTHORS @@ -119,6 +119,7 @@ answer newbie questions, and generally made Django that much better: Eric Moritz Robin Munn Nebojša Dorđević + Fraser Nevett Sam Newman Neal Norwitz oggie rob 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):