Reintroduced the changes from [3855] with more flexible handling of version
strings. Refs #2188, #2827. git-svn-id: http://code.djangoproject.com/svn/django/trunk@3872 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
ad14446780
commit
6068f3e4cb
1
AUTHORS
1
AUTHORS
|
@ -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>
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,12 @@ django_conversions.update({
|
|||
FIELD_TYPE.TIME: util.typecast_time,
|
||||
})
|
||||
|
||||
# This should match the numerical portion of the version numbers (we can treat
|
||||
# versions like 5.0.24 and 5.0.24a as the same). Based on the list of version
|
||||
# at http://dev.mysql.com/doc/refman/4.1/en/news.html and
|
||||
# http://dev.mysql.com/doc/refman/5.0/en/news.html .
|
||||
server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
|
||||
|
||||
# This is an extra debug layer over MySQL queries, to display warnings.
|
||||
# It's only used when DEBUG=True.
|
||||
class MysqlDebugWrapper:
|
||||
|
@ -61,6 +68,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 +118,16 @@ 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()
|
||||
m = server_version_re.match(self.connection.get_server_info())
|
||||
if not m:
|
||||
raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info())
|
||||
self.server_version = m.groups()
|
||||
return self.server_version
|
||||
|
||||
supports_constraints = True
|
||||
|
||||
def quote_name(name):
|
||||
|
|
Loading…
Reference in New Issue