Django est pratique car il émet automatiquement une instruction Create Table à partir du modèle écrit dans models.py pour créer une table ... Cependant, il ne prend pas en charge le point où les commentaires sont ajoutés aux tables et colonnes. Si vous souhaitez générer à rebours le diagramme ER à partir de la table créée, j'apprécierais que vous ajoutiez un commentaire ...
Donc, s'il n'y en a pas, j'ai essayé de le faire moi-même.
La syntaxe pour ajouter des commentaires de table ou des commentaires de colonne est la suivante.
comment on table table_name is 'comment'
comment on column table_name.column_name is 'comment'
Cependant, il s'agit d'une spécification propriétaire d'Oracle et PostgreSQL (et DB2), et il semble que ce ne soit pas un standard SQL. J'aurais aimé pouvoir faire sqlite3 avec la même syntaxe si possible, mais j'ai abandonné cette fois parce que cela semble impossible. À tout le moins, j'aimerais faire un commentaire sur Oracle, que j'utilise habituellement.
Vous pouvez le créer comme un module Python normal, mais comme c'est un gros problème, créez votre propre commande Django afin de pouvoir l'exécuter rapidement à partir de la ligne de commande. Pour les commandes Django, en héritant de la classe AppCommand, vous pouvez recevoir l'objet AppConfig de l'application Django comme argument, il est donc facile d'obtenir une liste de modèles pour créer des commentaires.
Concernant la création de commandes personnalisées Django, je me suis référé à l'article suivant.
De plus, j'ai fait référence à la source de django.core.manegement.commands.sqlsequencereset.
Le nom de la commande est "créer un commentaire de table". Le format devrait ressembler à ↓.
manage.py createtablecomment [options] <app_label app_label ...>
Puisque la commande créée cette fois n'est pas pour une application spécifique, placez le module dans le dossier du projet. (Ce qui suit est une référence pour le placement. Le nom du projet est "mon projet")
myproject
└ myproject
└ management
└ commands
└ createtablecomment.py
Sauf pour le contenu de handle_app_config, je copie sqlsequencereset.py et je l'utilise presque tel quel.
createtablecomment.py
from __future__ import unicode_literals
from optparse import make_option
from django.core.management.base import AppCommand
from django.core.management.sql import check_for_migrations
from django.db import connections, DEFAULT_DB_ALIAS
from django.db.models.fields.related import ForeignKey
class Command(AppCommand):
help = 'Prints the SQL statements for create comment of tables and columns for the given app name(s).'
option_list = AppCommand.option_list + (
make_option('--database', action='store', dest='database',
default=DEFAULT_DB_ALIAS, help='Nominates a database to print the '
'SQL for. Defaults to the "default" database.'),
)
output_transaction = True
def handle_app_config(self, app_config, **options):
if app_config.models_module is None:
return
connection = connections[options.get('database')]
check_for_migrations(app_config, connection)
models = app_config.get_models(include_auto_created=True)
cursor = connection.cursor()
statements = []
for model in models :
statement = "COMMENT ON TABLE %s IS '%s'" %
(model._meta.db_table, model._meta.verbose_name)
statements.append(statement)
cursor.execute(statement)
for field in model._meta.fields :
if isinstance(field, ForeignKey) :
column = '%s_id' % field.name
comment = '%s(FK:%s)' %
(field.verbose_name, field.related.parent_model._meta.db_table)
else :
column = '%s' % field.name
comment = field.verbose_name
statement = "COMMENT ON COLUMN %s.%s IS '%s'" %
(model._meta.db_table, column, comment)
statements.append(statement)
cursor.execute(statement)
return '\n'.join(statements)
Le contenu de traitement est comme ↓.
connection.cursorl ()
etcursor.execute (instruction)
)model._meta.fields
et tournez-la avec pourForeignKey
, complétez-le car" _id "est ajouté au nom de la colonne. Ajoutez également les informations" Quelle table est le FK? "J'ai essayé de l'exécuter pour l'application myapp qui a models.py de ↓.
models.py
from django.db import models
class Author(models.Model):
class Meta :
db_table = 'AUTHORS'
verbose_name = 'Auteur'
verbose_name_plural = verbose_name
name = models.CharField('Nom', max_length=50)
birthday = models.DateField('Anniversaire')
class BooK(models.Model):
class Meta:
verbose_name = 'Livre'
verbose_name_plural = verbose_name
name = models.CharField('Titre de livre', max_length=100)
price = models.IntegerField('prix')
author = models.ForeignKey(Author, verbose_name='Auteur')
Exécution de la commande
> python manage.py createtablecomment myapp
BEGIN;
COMMENT ON TABLE AUTHORS IS 'Auteur'
COMMENT ON COLUMN AUTHORS.id IS 'ID'
COMMENT ON COLUMN AUTHORS.name IS 'Nom'
COMMENT ON COLUMN AUTHORS.birthday IS 'Anniversaire'
COMMENT ON TABLE myapp_book IS 'Livre'
COMMENT ON COLUMN myapp_book.id IS 'ID'
COMMENT ON COLUMN myapp_book.name IS 'Titre de livre'
COMMENT ON COLUMN myapp_book.price IS 'prix'
COMMENT ON COLUMN myapp_book.author_id IS 'Auteur(FK:AUTHORS)'
COMMIT;
Les commentaires ont été créés avec succès sur les tables et les colonnes.