SchemaEditor¶
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 disponible Ă partir de Django 1.7. 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. Notez Ă©galement que les migrations vont se rĂ©fĂ©rer Ă certaines fonctionnalitĂ©s de base de donnĂ©es (classe DatabaseFeatures), notamment les drapeaux can_rollback_ddl et supports_combined_alters.
Méthodes¶
execute¶
ExĂ©cute lâinstruction SQL transmise, compte tenu des paramĂštres sâil y en a. Il sâagit dâune adaptation simple 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¶
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¶
Supprime la table de base de donnĂ©es correspondant au modĂšle indiquĂ©, ainsi que les Ă©ventuels contraintes dâunicitĂ© et index existants.
alter_unique_together¶
- BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[source]¶
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)[source]¶
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¶
Renomme la table correspondant au modĂšle de old_db_table vers new_db_table.
alter_db_tablespace¶
DĂ©place la table correspondant au modĂšle dâun espace de tables vers un autre.
add_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¶
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¶
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 (meth:.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 (comme South le faisait souvent).
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.