1
0
mirror of https://github.com/django/django.git synced 2024-12-23 09:36:06 +00:00

Fixed #24365 -- Made inspectdb translate MySQL unsigned integer columns to positive integer fields.

This commit is contained in:
Mariusz Felisiak 2017-03-08 16:56:00 +01:00 committed by Tim Graham
parent af121b08e8
commit 94d8bea212
3 changed files with 18 additions and 6 deletions

View File

@ -17,6 +17,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
can_introspect_autofield = True can_introspect_autofield = True
can_introspect_binary_field = False can_introspect_binary_field = False
can_introspect_small_integer_field = True can_introspect_small_integer_field = True
can_introspect_positive_integer_field = True
supports_index_column_ordering = False supports_index_column_ordering = False
supports_timezones = False supports_timezones = False
requires_explicit_null_ordering_when_grouping = True requires_explicit_null_ordering_when_grouping = True

View File

@ -10,8 +10,8 @@ from django.db.models.indexes import Index
from django.utils.datastructures import OrderedSet from django.utils.datastructures import OrderedSet
from django.utils.deprecation import RemovedInDjango21Warning from django.utils.deprecation import RemovedInDjango21Warning
FieldInfo = namedtuple('FieldInfo', FieldInfo._fields + ('extra',)) FieldInfo = namedtuple('FieldInfo', FieldInfo._fields + ('extra', 'is_unsigned'))
InfoLine = namedtuple('InfoLine', 'col_name data_type max_len num_prec num_scale extra column_default') InfoLine = namedtuple('InfoLine', 'col_name data_type max_len num_prec num_scale extra column_default is_unsigned')
class DatabaseIntrospection(BaseDatabaseIntrospection): class DatabaseIntrospection(BaseDatabaseIntrospection):
@ -45,7 +45,11 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
return 'AutoField' return 'AutoField'
elif field_type == 'BigIntegerField': elif field_type == 'BigIntegerField':
return 'BigAutoField' return 'BigAutoField'
if description.is_unsigned:
if field_type == 'IntegerField':
return 'PositiveIntegerField'
elif field_type == 'SmallIntegerField':
return 'PositiveSmallIntegerField'
return field_type return field_type
def get_table_list(self, cursor): def get_table_list(self, cursor):
@ -65,8 +69,13 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
# - precision and scale (for decimal fields) (#5014) # - precision and scale (for decimal fields) (#5014)
# - auto_increment is not available in cursor.description # - auto_increment is not available in cursor.description
cursor.execute(""" cursor.execute("""
SELECT column_name, data_type, character_maximum_length, numeric_precision, SELECT
numeric_scale, extra, column_default column_name, data_type, character_maximum_length,
numeric_precision, numeric_scale, extra, column_default,
CASE
WHEN column_type LIKE '%% unsigned' THEN 1
ELSE 0
END AS is_unsigned
FROM information_schema.columns FROM information_schema.columns
WHERE table_name = %s AND table_schema = DATABASE()""", [table_name]) WHERE table_name = %s AND table_schema = DATABASE()""", [table_name])
field_info = {line[0]: InfoLine(*line) for line in cursor.fetchall()} field_info = {line[0]: InfoLine(*line) for line in cursor.fetchall()}
@ -90,6 +99,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
line[6], line[6],
field_info[col_name].column_default, field_info[col_name].column_default,
field_info[col_name].extra, field_info[col_name].extra,
field_info[col_name].is_unsigned,
) )
)) ))
) )

View File

@ -159,7 +159,8 @@ Internationalization
Management Commands Management Commands
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
* ... * :djadmin:`inspectdb` now translates MySQL's unsigned integer columns to
``PositiveIntegerField`` or ``PositiveSmallIntegerField``.
Migrations Migrations
~~~~~~~~~~ ~~~~~~~~~~