SchemaEditor
¶
-
class
BaseDatabaseSchemaEditor
¶
Le systÚme des migrations de Django est partagé en deux parties : la logique pour le calcul et le stockage des opérations à exécuter (django.db.migrations
) et la couche dâabstraction de base de donnĂ©es qui transforme des choses du genre « crĂ©er un modĂšle » ou « supprimer un champ » en code SQL, ce qui est le travail de SchemaEditor
.
Il est peu probable que vous deviez interagir directement avec une instance SchemaEditor
en tant que dĂ©veloppeur rĂ©gulier de Django, mais si vous souhaitez Ă©crire votre propre systĂšme de migrations ou que vous avez des besoins plus pointus, câest beaucoup plus agrĂ©able que dâavoir Ă Ă©crire du code SQL.
Chae moteur de base de données dans Django fournit sa propre version de SchemaEditor
, qui est toujours accessible via le gestionnaire de contexte connection.schema_editor()
:
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(MyModel)
Il doit ĂȘtre utilisĂ© via le gestionnaire de contexte car cela permet de gĂ©rer des Ă©lĂ©ments comme les transactions et le code SQL diffĂ©rĂ© (comme pour crĂ©er des contraintes de clĂ© Ă©trangĂšre).
Cet Ă©diteur expose toutes les opĂ©rations possibles sous forme de mĂ©thodes qui doivent ĂȘtre appelĂ©es dans lâordre voulu dâapplication des changements. Certaines opĂ©rations ou types de modification ne sont pas toujours possibles en fonction de la base de donnĂ©es ; par exemple, le moteur MySQL MyISAM
ne gÚre pas les contraintes de clé étrangÚre.
Si vous écrivez ou maintenez une moteur de base de données hors du code Django, vous allez devoir fournir une implémentation de SchemaEditor
afin de pouvoir prendre en charge la fonctionnalitĂ© des migrations de Django. Toutefois, tant que la base de donnĂ©es en question respecte globalement les standards en terme de SQL et de conception relationnelle, il doit ĂȘtre possible dâhĂ©riter de lâune des classes SchemaEditor
de Django et dâadapter lĂ©gĂšrement la syntaxe.
Méthodes¶
execute()
¶
-
BaseDatabaseSchemaEditor.
execute
(sql, params=())¶
ExĂ©cute lâinstruction SQL transmise, compte tenu des paramĂštres sâil y en a. Il sâagit dâune adaptation autour des curseurs normaux des bases de donnĂ©es qui ajoute la possibilitĂ© de capturer le code SQL produit dans un fichier .sql
si lâutilisateur le souhaite.
create_model()
¶
-
BaseDatabaseSchemaEditor.
create_model
(model)¶
CrĂ©e une nouvelle table de base de donnĂ©es correspondant au modĂšle indiquĂ©, y compris les contraintes dâunicitĂ© et les index nĂ©cessaires.
delete_model()
¶
-
BaseDatabaseSchemaEditor.
delete_model
(model)¶
Supprime la table de base de donnĂ©es correspondant au modĂšle indiquĂ©, ainsi que les Ă©ventuels contraintes dâunicitĂ© et index existants.
remove_index()
¶
-
BaseDatabaseSchemaEditor.
remove_index
(model, index)¶
Supprime index
de la table de model
.
rename_index()
¶
-
BaseDatabaseSchemaEditor.
rename_index
(model, old_index, new_index)¶
Renames old_index
from model
âs table to new_index
.
add_constraint()
¶
-
BaseDatabaseSchemaEditor.
add_constraint
(model, constraint)¶
Ajoute constraint
Ă la table de model
.
remove_constraint()
¶
-
BaseDatabaseSchemaEditor.
remove_constraint
(model, constraint)¶
Supprime constraint
de la table de model
.
alter_unique_together()
¶
-
BaseDatabaseSchemaEditor.
alter_unique_together
(model, old_unique_together, new_unique_together)¶
Modifie la valeur unique_together
dâun modĂšle ; cette opĂ©ration ajoute ou supprime les contraintes dâunicitĂ© de la table correspondant au modĂšle jusquâĂ ce que la nouvelle valeur soit complĂštement reflĂ©tĂ©e dans la base de donnĂ©es.
alter_index_together()
¶
-
BaseDatabaseSchemaEditor.
alter_index_together
(model, old_index_together, new_index_together)¶
Modifie la valeur index_together
dâun modĂšle ; cette opĂ©ration ajoute ou supprime les index de la table correspondant au modĂšle jusquâĂ ce que la nouvelle valeur soit complĂštement reflĂ©tĂ©e dans la base de donnĂ©es.
alter_db_table()
¶
-
BaseDatabaseSchemaEditor.
alter_db_table
(model, old_db_table, new_db_table)¶
Renomme la table correspondant au modĂšle de old_db_table
vers new_db_table
.
alter_db_tablespace()
¶
-
BaseDatabaseSchemaEditor.
alter_db_tablespace
(model, old_db_tablespace, new_db_tablespace)¶
DĂ©place la table correspondant au modĂšle dâun espace de tables vers un autre.
add_field()
¶
-
BaseDatabaseSchemaEditor.
add_field
(model, field)¶
Ajoute une colonne (ou parfois plusieurs) Ă la table correspondant au modĂšle pour reprĂ©senter le champ indiquĂ©. Cette opĂ©ration peut aussi ajouter un index ou une contrainte dâunicitĂ© en fonction des paramĂštres db_index
et unique
du champ.
Si le champ est une instance ManyToManyField
sans valeur spécifique pour through
, cette méthode crée une table pour représenter la relation au lieu de créer une colonne. Si through
est spĂ©cifiĂ© pour ce champ, il sâagit dâune opĂ©ration blanche.
Si le champ est une instance ForeignKey
, cette méthode ajoute aussi les contraintes de clé étrangÚre pour la colonne concernée.
remove_field()
¶
-
BaseDatabaseSchemaEditor.
remove_field
(model, field)¶
EnlĂšve la ou les colonnes reprĂ©sentant le champ dans la table correspondant au modĂšle, ainsi que toutes Ă©ventuelles contraintes dâunicitĂ©, de clĂ© Ă©trangĂšre ou dâindex qui auraient Ă©tĂ© créés pour ce champ.
Si le champ est une instance ManyToManyField
sans valeur spécifique pour through
, cette méthode supprime la table créée pour établir la relation. Si through
est spĂ©cifiĂ© pour ce champ, il sâagit dâune opĂ©ration blanche.
alter_field()
¶
-
BaseDatabaseSchemaEditor.
alter_field
(model, old_field, new_field, strict=False)¶
Cette méthode transforme le champ de modÚle old_field
pour quâil corresponde Ă new_field
. Cela inclut le changement de nom de colonne (lâattribut db_column
), le changement de type de champ (si la classe du champ est diffĂ©rente), le changement de lâĂ©tat NULL
du champ, lâajout ou la suppression de contraintes dâunicitĂ© ou dâindex liĂ©s Ă un seul champ, le changement de lâĂ©tat clĂ© primaire et le changement de la destination dâune contrainte ForeignKey
.
La transformation la plus courante que cette mĂ©thode ne peut pas faire est la transformation dâun champ ManyToManyField
en un champ normal et inversement ; Django ne peut pas faire cela sans perdre des donnĂ©es, il va donc refuser de le faire. Pour le faire quand mĂȘme, il faut ajouter sĂ©parĂ©ment des opĂ©rations de suppression (remove_field()
) et dâajout (add_field()
) de champ.
Si la base de données prend en charge les modifications combinées (drapeau supports_combined_alters
), Django essaie de faire autant que possible ces opĂ©rations dans un seul appel Ă la base de donnĂ©es ; sinon, il Ă©met une instruction ALTER sĂ©parĂ©e pour chaque modification, mais il nâĂ©met pas dâinstruction ALTER lorsquâaucun changement nâest nĂ©cessaire.
Attributs¶
Tous les attributs doivent ĂȘtre considĂ©rĂ©s en lecture seule, sauf mention contraire.
connection
¶
-
SchemaEditor.
connection
¶
Un objet de connexion à la base de données. Un attribut utile de la connexion est alias
qui peut ĂȘtre utilisĂ© pour dĂ©terminer le nom de la base de donnĂ©es en cours dâaccĂšs.
Câest pratique lors de migrations de donnĂ©es pour des migrations avec plusieurs bases de donnĂ©es.