from django.core import checks from django.db.backends.base.validation import BaseDatabaseValidation from django.utils.version import get_docs_version class DatabaseValidation(BaseDatabaseValidation): def check(self, **kwargs): issues = super().check(**kwargs) issues.extend(self._check_sql_mode(**kwargs)) return issues def _check_sql_mode(self, **kwargs): if not ( self.connection.sql_mode & {"STRICT_TRANS_TABLES", "STRICT_ALL_TABLES"} ): return [ checks.Warning( "%s Strict Mode is not set for database connection '%s'" % (self.connection.display_name, self.connection.alias), hint=( "%s's Strict Mode fixes many data integrity problems in " "%s, such as data truncation upon insertion, by " "escalating warnings into errors. It is strongly " "recommended you activate it. See: " "https://docs.djangoproject.com/en/%s/ref/databases/" "#mysql-sql-mode" % ( self.connection.display_name, self.connection.display_name, get_docs_version(), ), ), id="mysql.W002", ) ] return [] def check_field_type(self, field, field_type): """ MySQL has the following field length restriction: No character (varchar) fields can have a length exceeding 255 characters if they have a unique index on them. MySQL doesn't support a database index on some data types. """ errors = [] if ( field_type.startswith("varchar") and field.unique and (field.max_length is None or int(field.max_length) > 255) ): errors.append( checks.Warning( "%s may not allow unique CharFields to have a max_length " "> 255." % self.connection.display_name, obj=field, hint=( "See: https://docs.djangoproject.com/en/%s/ref/" "databases/#mysql-character-fields" % get_docs_version() ), id="mysql.W003", ) ) if field.db_index and field_type.lower() in self.connection._limited_data_types: errors.append( checks.Warning( "%s does not support a database index on %s columns." % (self.connection.display_name, field_type), hint=( "An index won't be created. Silence this warning if " "you don't care about it." ), obj=field, id="fields.W162", ) ) return errors