Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.