Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article documente comment les types de champs de modèles Django correspondent aux types de données SQL Server lors de l’utilisation du mssql-django backend.
Table de cartographie des types de champs
| Champ de Django | Type SQL Server | Remarques |
|---|---|---|
AutoField |
int avec IDENTITY(1,1) |
Clé primaire à incrément automatique. |
BigAutoField |
bigint avec IDENTITY(1,1) |
Clé primaire à incrément automatique 64 bits. |
SmallAutoField |
smallint avec IDENTITY(1,1) |
Clé primaire à incrément automatique de 16 bits. |
BooleanField |
bit | Magasins 0 ou 1. |
CharField(max_length=N) |
nvarchar(N) | Données de caractères Unicode. |
DateField |
date | Date sans heure. |
DateTimeField |
datetime2 | Date et heure avec fractions de seconde. Utilise l’offset datetimetime lorsque USE_TZ=True. |
DecimalField(max_digits=M, decimal_places=D) |
numérique(M, D) | Décimal à précision fixe. |
DurationField |
bigint | Stocké sous forme de microsecondes. |
EmailField |
nvarchar (254) | CharField avec validation d’email. |
FileField |
nvarchar(100) | Stocke le chemin du fichier. |
FilePathField |
nvarchar(100) | Stocke le chemin du système de fichiers. |
FloatField |
float | Virgule flottante 64 bits (float(53)). SQL Server accepte également le synonyme double precision. |
IntegerField |
int | Entier signé 32 bits. |
BigIntegerField |
bigint | Entier signé 64 bits. |
SmallIntegerField |
smallint | Entier signé 16 bits. |
PositiveIntegerField |
int | Avec une contrainte >= 0CHECK . |
PositiveBigIntegerField |
bigint | Avec une contrainte >= 0CHECK . |
PositiveSmallIntegerField |
smallint | Avec une contrainte >= 0CHECK . |
GenericIPAddressField |
Nvarchar (39) | Adresse IPv4 ou IPv6. |
JSONField |
nvarchar(max) | Avec la contrainte de vérification JSON. |
SlugField |
nvarchar(50) | CharField avec validation de slug. |
TextField |
nvarchar(max) | Texte Unicode de longueur illimitée. |
TimeField |
time | Temps sans date. |
URLField |
nvarchar(200) | CharField avec validation d’URL. |
UUIDField |
char(32) | UUID stocké sous forme de chaîne hexadécimale de 32 caractères. |
BinaryField |
Varbinaire(N) | Données binaires brutes. Le backend sert max_length à émettre varbinary(N). |
ForeignKey |
C’est pareil pour le champ référencé | Crée une contrainte d’indice et de code de la ligne de commande. |
OneToOneField |
C’est pareil pour le champ référencé | Crée un indice unique et une contrainte FK. |
ManyToManyField |
N/A | Crée une table intermédiaire. |
Comportements spécifiques à SQL Server
Certains types de champs Django présentent un comportement spécifique à la plateforme lorsqu’ils sont utilisés avec SQL Server.
Limitation d’AutoField
Modifier un champ de modèle de ou vers AutoField au moment de la migration n’est pas pris en charge. Si vous devez changer le type de clé primaire, créez un nouveau champ et migrez les données manuellement.
Champ booléen et bit
Stockage 0 SQL Server et 1. Django correspond True/False à ces valeurs.
NULL est supporté par BooleanField(null=True).
Prise en charge de DateTimeField et de fuseaux horaires
Dans USE_TZ=True vos paramètres Django, DateTimeField utilisez le décalage de datetimeoffset pour enregistrer les dates en fonction du fuseau horaire. Quand USE_TZ=False, il utilise datetime2.
Si vous activez USE_TZ après avoir créé les colonnes, vous devez migrer manuellement les colonnes datetime2 existantes vers datetimeoffset. Pour plus d’informations, voir Prise en charge des fuseaux horaires dans mssql-django.
TextField vs CharField
SQL Server mappe les deux TextField et CharField vers nvarchar.
TextField utilise nvarchar(max) tandis que CharFieldnvarchar(N) où N est max_length.
Tous les champs de chaîne utilisent nvarchar (Unicode)
Le mssql-django backend mappe tous les champs de chaînes Django (CharField, TextField, EmailField, URLField, SlugField, et autres) en nvarchar, le type de chaîne Unicode. Il n’y a pas d’option intégrée pour utiliser varchar (non-Unicode) à la place.
C’est intentionnel. La gestion des chaînes de Django est Unicode partout, et nvarchar garantit que tous les caractères sont stockés correctement, quel que soit le langage ou l’encodage. Utiliser nvarchar évite la perte de données due aux incompatibilités de jeux de caractères.
Compromis :
- NVARchar utilise 2 octets par caractère, contre 1 octet par caractère pour varchar avec des collations à un seul octet.
- Les limites de taille des clés d’index s’appliquent (900 octets pour les index non clusterisés). Une colonne nvarchar(450) atteint la limite de 900 octets (450 x 2 octets), tandis qu’une colonne varchar(900) atteint la même limite en utilisant des caractères à un seul octet.
- Si vos données sont exclusivement ASCII, nvarchar double le stockage par rapport à varchar.
Si vous avez besoin de colonnes varchar :
Pour les bases de données héritées ou les exigences strictes de stockage, créez un champ personnalisé qui remplace 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
L’utilisation de colonnes varchar risque de perdre des données si des caractères non-ASCII sont écrits. Utilisez cette approche uniquement lorsque vous êtes certain que la colonne stocke uniquement des données ASCII, ou lorsque vous devez correspondre un schéma de base de données existant.