summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2017-03-08 16:56:00 +0100
committerTim Graham <timograham@gmail.com>2017-03-08 10:56:00 -0500
commit94d8bea212441ebfafcab10d245285581e701c54 (patch)
treea580b6a04fdc2a7667b017a513c3a211edb5286a
parentaf121b08e85f2afe9c15dd66cb73f5d99515a604 (diff)
Fixed #24365 -- Made inspectdb translate MySQL unsigned integer columns to positive integer fields.
-rw-r--r--django/db/backends/mysql/features.py1
-rw-r--r--django/db/backends/mysql/introspection.py20
-rw-r--r--docs/releases/2.0.txt3
3 files changed, 18 insertions, 6 deletions
diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py
index 89cb2c00db..ef02e28bb8 100644
--- a/django/db/backends/mysql/features.py
+++ b/django/db/backends/mysql/features.py
@@ -17,6 +17,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
can_introspect_autofield = True
can_introspect_binary_field = False
can_introspect_small_integer_field = True
+ can_introspect_positive_integer_field = True
supports_index_column_ordering = False
supports_timezones = False
requires_explicit_null_ordering_when_grouping = True
diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py
index 9e72bdc1f8..8f61fa3061 100644
--- a/django/db/backends/mysql/introspection.py
+++ b/django/db/backends/mysql/introspection.py
@@ -10,8 +10,8 @@ from django.db.models.indexes import Index
from django.utils.datastructures import OrderedSet
from django.utils.deprecation import RemovedInDjango21Warning
-FieldInfo = namedtuple('FieldInfo', FieldInfo._fields + ('extra',))
-InfoLine = namedtuple('InfoLine', 'col_name data_type max_len num_prec num_scale extra column_default')
+FieldInfo = namedtuple('FieldInfo', FieldInfo._fields + ('extra', 'is_unsigned'))
+InfoLine = namedtuple('InfoLine', 'col_name data_type max_len num_prec num_scale extra column_default is_unsigned')
class DatabaseIntrospection(BaseDatabaseIntrospection):
@@ -45,7 +45,11 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
return 'AutoField'
elif field_type == 'BigIntegerField':
return 'BigAutoField'
-
+ if description.is_unsigned:
+ if field_type == 'IntegerField':
+ return 'PositiveIntegerField'
+ elif field_type == 'SmallIntegerField':
+ return 'PositiveSmallIntegerField'
return field_type
def get_table_list(self, cursor):
@@ -65,8 +69,13 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
# - precision and scale (for decimal fields) (#5014)
# - auto_increment is not available in cursor.description
cursor.execute("""
- SELECT column_name, data_type, character_maximum_length, numeric_precision,
- numeric_scale, extra, column_default
+ SELECT
+ 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
WHERE table_name = %s AND table_schema = DATABASE()""", [table_name])
field_info = {line[0]: InfoLine(*line) for line in cursor.fetchall()}
@@ -90,6 +99,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
line[6],
field_info[col_name].column_default,
field_info[col_name].extra,
+ field_info[col_name].is_unsigned,
)
))
)
diff --git a/docs/releases/2.0.txt b/docs/releases/2.0.txt
index 1c26193456..4592d8b76d 100644
--- a/docs/releases/2.0.txt
+++ b/docs/releases/2.0.txt
@@ -159,7 +159,8 @@ Internationalization
Management Commands
~~~~~~~~~~~~~~~~~~~
-* ...
+* :djadmin:`inspectdb` now translates MySQL's unsigned integer columns to
+ ``PositiveIntegerField`` or ``PositiveSmallIntegerField``.
Migrations
~~~~~~~~~~