Campo Django a mapeos de tipos de SQL Server

Este artículo documenta cómo los tipos de campos de los modelos Django se corresponden con los tipos de datos de SQL Server al utilizar el mssql-django backend.

Tabla de mapeo de tipos de campo

Campo de Django Tipo de SQL Server Notas
AutoField int con IDENTITY(1,1) Llave primaria con incremento automático.
BigAutoField bigint con IDENTITY(1,1) Llave primaria de incremento automático de 64 bits.
SmallAutoField smallint con IDENTITY(1,1) Clave primaria de incremento automático de 16 bits.
BooleanField bit Tiendas 0 o 1.
CharField(max_length=N) nvarchar(N) Datos de caracteres Unicode.
DateField date Fecha sin hora.
DateTimeField datetime2 Fecha y hora con fracciones de segundo. Utiliza fechatiempotiempo desfasado cuando USE_TZ=True.
DecimalField(max_digits=M, decimal_places=D) numérico(M, D) Decimal de precisión fija.
DurationField bigint Almacenado como microsegundos.
EmailField nvarchar (254) CharField con validación de correo electrónico.
FileField nvarchar(100) Almacena la ruta del archivo.
FilePathField nvarchar(100) Almacena la ruta del sistema de archivos.
FloatField float Punto flotante de 64 bits (float(53)). SQL Server también acepta el sinónimo double precision.
IntegerField int Entero de 32 bits con signo.
BigIntegerField bigint Entero con signo de 64 bits.
SmallIntegerField smallint Entero de 16 bits con signo.
PositiveIntegerField int Con una restricción >= 0CHECK .
PositiveBigIntegerField bigint Con una restricción >= 0CHECK .
PositiveSmallIntegerField smallint Con una restricción >= 0CHECK .
GenericIPAddressField Nvarchar(39) IPv4 o dirección IPv6.
JSONField nvarchar(max) Con restricción de comprobación JSON. Requiere SQL Server 2016+.
SlugField nvarchar(50) CharField con validación de babosa.
TextField nvarchar(max) Texto Unicode de longitud ilimitada.
TimeField time Tiempo sin fecha.
URLField nvarchar(200) CharField con validación de URL.
UUIDField char(32) UUID almacenado como cadena hexadecimal de 32 caracteres.
BinaryField varbinario(N) Datos binarios sin formato. El backend emite max_lengthvarbinary(N).
ForeignKey Igual que el campo referenciado Crea una restricción de índice y FK.
OneToOneField Igual que el campo referenciado Crea una restricción única de índice y FK.
ManyToManyField N/A Crea una tabla intermedia.

Comportamientos específicos de SQL Server

Algunos tipos de campos de Django presentan comportamientos específicos de la plataforma cuando se usan con SQL Server.

Limitación de AutoField

No se permite modificar un campo de modelo desde o hacia AutoField en el momento de la migración. Si necesitas cambiar el tipo de clave primaria, crea un campo nuevo y migra los datos manualmente.

BooleanField y bit

SQL Server almacena 0tipos de bits y 1archivos de . Django se mapea True/False a estos valores. NULL se apoya con BooleanField(null=True).

Soporte para DateTimeField y zona horaria

Cuando USE_TZ=True uses la configuración de Django, DateTimeField usa el desfasamiento de fecha para guardar las fechas con la zona horaria. Cuando USE_TZ=False, usa datetime2.

Si activas USE_TZ después de crear columnas, debes migrar manualmente las columnas existentes de datetime2 a datetimeoffset. Para más información, véase Soporte de zonas horarias en mssql-django.

TextField vs CharField

SQL Server mapea ambos TextField y CharField a nvarchar. TextField usa nvarchar(max) mientras CharField que usa nvarchar(N) donde N es max_length.

Todos los campos de cadenas usan nvarchar (Unicode)

El mssql-django backend asigna todos los campos de cadenas de Django (CharField, TextField, EmailField, URLField, SlugField, y otros) a nvarchar, el tipo de cadena Unicode. No hay ninguna opción incorporada para usar varchar (que no sea Unicode).

es así por diseño. El manejo de cadenas de Django es Unicode en todo momento, y nvarchar asegura que todos los caracteres se almacenen correctamente independientemente del idioma o la codificación. Usar nvarchar evita la pérdida de datos por desajustes en el conjunto de caracteres.

Compensaciones:

  • NVARchar utiliza 2 bytes por carácter, en comparación con 1 byte por carácter para varchar con colaciones de un solo byte.
  • Se aplican límites de tamaño de clave de índice (900 bytes para índices no agrupados). Una columna nvarchar(450) alcanza el límite de 900 bytes (450 x 2 bytes), mientras que una columna varchar(900) alcanza el mismo límite usando caracteres de un solo byte.
  • Si tus datos son exclusivamente ASCII, nvarchar duplica el almacenamiento comparado con varchar.

Si necesitas columnas varchar:

Para bases de datos heredadas o requisitos estrictos de almacenamiento, crea un campo personalizado que sobrescriba db_type:

from django.db import models

class VarcharField(models.CharField):
    def db_type(self, connection):
        return f"varchar({self.max_length})"

class LegacyProduct(models.Model):
    sku = VarcharField(max_length=50)  # Creates varchar(50) instead of nvarchar(50)

    class Meta:
        managed = False  # For existing tables
        db_table = "LegacyProduct"

Caution

Usar columnas varchar corre el riesgo de pérdida de datos si se escriben caracteres no ASCII. Usa este enfoque solo cuando estés seguro de que la columna almacena datos solo en ASCII, o cuando necesites coincidir con un esquema de base de datos existente.