mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #30661 -- Added models.SmallAutoField.
This commit is contained in:
committed by
Mariusz Felisiak
parent
955b382600
commit
194d1dfc18
@@ -143,9 +143,10 @@ class BaseDatabaseFeatures:
|
||||
# Can the backend introspect a TimeField, instead of a DateTimeField?
|
||||
can_introspect_time_field = True
|
||||
|
||||
# Some backends may not be able to differentiate BigAutoField from other
|
||||
# fields such as AutoField.
|
||||
# Some backends may not be able to differentiate BigAutoField or
|
||||
# SmallAutoField from other fields such as AutoField.
|
||||
introspected_big_auto_field_type = 'BigAutoField'
|
||||
introspected_small_auto_field_type = 'SmallAutoField'
|
||||
|
||||
# Some backends may not be able to differentiate BooleanField from other
|
||||
# fields such as IntegerField.
|
||||
|
||||
@@ -182,7 +182,7 @@ class BaseDatabaseSchemaEditor:
|
||||
))
|
||||
# Autoincrement SQL (for backends with post table definition
|
||||
# variant).
|
||||
if field.get_internal_type() in ('AutoField', 'BigAutoField'):
|
||||
if field.get_internal_type() in ('AutoField', 'BigAutoField', 'SmallAutoField'):
|
||||
autoinc_sql = self.connection.ops.autoinc_sql(model._meta.db_table, field.column)
|
||||
if autoinc_sql:
|
||||
self.deferred_sql.extend(autoinc_sql)
|
||||
|
||||
@@ -123,6 +123,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||
'PositiveIntegerField': 'integer UNSIGNED',
|
||||
'PositiveSmallIntegerField': 'smallint UNSIGNED',
|
||||
'SlugField': 'varchar(%(max_length)s)',
|
||||
'SmallAutoField': 'smallint AUTO_INCREMENT',
|
||||
'SmallIntegerField': 'smallint',
|
||||
'TextField': 'longtext',
|
||||
'TimeField': 'time(6)',
|
||||
|
||||
@@ -44,6 +44,8 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
|
||||
return 'AutoField'
|
||||
elif field_type == 'BigIntegerField':
|
||||
return 'BigAutoField'
|
||||
elif field_type == 'SmallIntegerField':
|
||||
return 'SmallAutoField'
|
||||
if description.is_unsigned:
|
||||
if field_type == 'IntegerField':
|
||||
return 'PositiveIntegerField'
|
||||
|
||||
@@ -19,6 +19,7 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||
cast_data_types = {
|
||||
'AutoField': 'signed integer',
|
||||
'BigAutoField': 'signed integer',
|
||||
'SmallAutoField': 'signed integer',
|
||||
'CharField': 'char(%(max_length)s)',
|
||||
'DecimalField': 'decimal(%(max_digits)s, %(decimal_places)s)',
|
||||
'TextField': 'char',
|
||||
|
||||
@@ -123,6 +123,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||
'PositiveIntegerField': 'NUMBER(11)',
|
||||
'PositiveSmallIntegerField': 'NUMBER(11)',
|
||||
'SlugField': 'NVARCHAR2(%(max_length)s)',
|
||||
'SmallAutoField': 'NUMBER(5) GENERATED BY DEFAULT ON NULL AS IDENTITY',
|
||||
'SmallIntegerField': 'NUMBER(11)',
|
||||
'TextField': 'NCLOB',
|
||||
'TimeField': 'TIMESTAMP',
|
||||
|
||||
@@ -35,6 +35,8 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
|
||||
if scale == 0:
|
||||
if precision > 11:
|
||||
return 'BigAutoField' if description.is_autofield else 'BigIntegerField'
|
||||
elif 1 < precision < 6 and description.is_autofield:
|
||||
return 'SmallAutoField'
|
||||
elif precision == 1:
|
||||
return 'BooleanField'
|
||||
elif description.is_autofield:
|
||||
|
||||
@@ -56,6 +56,7 @@ END;
|
||||
cast_data_types = {
|
||||
'AutoField': 'NUMBER(11)',
|
||||
'BigAutoField': 'NUMBER(19)',
|
||||
'SmallAutoField': 'NUMBER(5)',
|
||||
'TextField': cast_char_field_without_max_length,
|
||||
}
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||
# Make a new field that's like the new one but with a temporary
|
||||
# column name.
|
||||
new_temp_field = copy.deepcopy(new_field)
|
||||
new_temp_field.null = (new_field.get_internal_type() not in ('AutoField', 'BigAutoField'))
|
||||
new_temp_field.null = (new_field.get_internal_type() not in ('AutoField', 'BigAutoField', 'SmallAutoField'))
|
||||
new_temp_field.column = self._generate_temp_name(new_field.column)
|
||||
# Add it
|
||||
self.add_field(model, new_temp_field)
|
||||
|
||||
@@ -92,6 +92,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||
'PositiveIntegerField': 'integer',
|
||||
'PositiveSmallIntegerField': 'smallint',
|
||||
'SlugField': 'varchar(%(max_length)s)',
|
||||
'SmallAutoField': 'smallserial',
|
||||
'SmallIntegerField': 'smallint',
|
||||
'TextField': 'text',
|
||||
'TimeField': 'time',
|
||||
|
||||
@@ -37,6 +37,8 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
|
||||
return 'AutoField'
|
||||
elif field_type == 'BigIntegerField':
|
||||
return 'BigAutoField'
|
||||
elif field_type == 'SmallIntegerField':
|
||||
return 'SmallAutoField'
|
||||
return field_type
|
||||
|
||||
def get_table_list(self, cursor):
|
||||
|
||||
@@ -11,6 +11,7 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||
cast_data_types = {
|
||||
'AutoField': 'integer',
|
||||
'BigAutoField': 'bigint',
|
||||
'SmallAutoField': 'smallint',
|
||||
}
|
||||
|
||||
def unification_cast_sql(self, output_field):
|
||||
|
||||
@@ -69,15 +69,15 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||
self.sql_alter_column_type += ' USING %(column)s::%(type)s'
|
||||
# Make ALTER TYPE with SERIAL make sense.
|
||||
table = strip_quotes(model._meta.db_table)
|
||||
if new_type.lower() in ("serial", "bigserial"):
|
||||
serial_fields_map = {'bigserial': 'bigint', 'serial': 'integer', 'smallserial': 'smallint'}
|
||||
if new_type.lower() in serial_fields_map:
|
||||
column = strip_quotes(new_field.column)
|
||||
sequence_name = "%s_%s_seq" % (table, column)
|
||||
col_type = "integer" if new_type.lower() == "serial" else "bigint"
|
||||
return (
|
||||
(
|
||||
self.sql_alter_column_type % {
|
||||
"column": self.quote_name(column),
|
||||
"type": col_type,
|
||||
"type": serial_fields_map[new_type.lower()],
|
||||
},
|
||||
[],
|
||||
),
|
||||
|
||||
@@ -104,6 +104,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||
'PositiveIntegerField': 'integer unsigned',
|
||||
'PositiveSmallIntegerField': 'smallint unsigned',
|
||||
'SlugField': 'varchar(%(max_length)s)',
|
||||
'SmallAutoField': 'integer',
|
||||
'SmallIntegerField': 'smallint',
|
||||
'TextField': 'text',
|
||||
'TimeField': 'time',
|
||||
@@ -116,6 +117,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
||||
data_types_suffix = {
|
||||
'AutoField': 'AUTOINCREMENT',
|
||||
'BigAutoField': 'AUTOINCREMENT',
|
||||
'SmallAutoField': 'AUTOINCREMENT',
|
||||
}
|
||||
# SQLite requires LIKE statements to include an ESCAPE clause if the value
|
||||
# being escaped has a percent or underscore in it.
|
||||
|
||||
@@ -19,6 +19,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
||||
can_introspect_positive_integer_field = True
|
||||
can_introspect_small_integer_field = True
|
||||
introspected_big_auto_field_type = 'AutoField'
|
||||
introspected_small_auto_field_type = 'AutoField'
|
||||
supports_transactions = True
|
||||
atomic_transactions = False
|
||||
can_rollback_ddl = True
|
||||
|
||||
@@ -57,9 +57,9 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
|
||||
|
||||
def get_field_type(self, data_type, description):
|
||||
field_type = super().get_field_type(data_type, description)
|
||||
if description.pk and field_type in {'BigIntegerField', 'IntegerField'}:
|
||||
# No support for BigAutoField as SQLite treats all integer primary
|
||||
# keys as signed 64-bit integers.
|
||||
if description.pk and field_type in {'BigIntegerField', 'IntegerField', 'SmallIntegerField'}:
|
||||
# No support for BigAutoField or SmallAutoField as SQLite treats
|
||||
# all integer primary keys as signed 64-bit integers.
|
||||
return 'AutoField'
|
||||
return field_type
|
||||
|
||||
|
||||
@@ -38,8 +38,8 @@ __all__ = [
|
||||
'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField',
|
||||
'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField',
|
||||
'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField',
|
||||
'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField',
|
||||
'TimeField', 'URLField', 'UUIDField',
|
||||
'PositiveSmallIntegerField', 'SlugField', 'SmallAutoField',
|
||||
'SmallIntegerField', 'TextField', 'TimeField', 'URLField', 'UUIDField',
|
||||
]
|
||||
|
||||
|
||||
@@ -985,6 +985,16 @@ class BigAutoField(AutoField):
|
||||
return BigIntegerField().db_type(connection=connection)
|
||||
|
||||
|
||||
class SmallAutoField(AutoField):
|
||||
description = _('Small integer')
|
||||
|
||||
def get_internal_type(self):
|
||||
return 'SmallAutoField'
|
||||
|
||||
def rel_db_type(self, connection):
|
||||
return SmallIntegerField().db_type(connection=connection)
|
||||
|
||||
|
||||
class BooleanField(Field):
|
||||
empty_strings_allowed = False
|
||||
default_error_messages = {
|
||||
|
||||
Reference in New Issue
Block a user