Django ist praktisch, da es automatisch eine Anweisung zum Erstellen einer Tabelle aus dem in models.py geschriebenen Modell ausgibt, um eine Tabelle zu erstellen. Es unterstützt jedoch nicht den Punkt, an dem Kommentare zu Tabellen und Spalten hinzugefügt werden. Wenn Sie das ER-Diagramm aus der erstellten Tabelle rückwärts generieren möchten, würde ich mich freuen, wenn Sie einen Kommentar hinzufügen könnten ...
Also, wenn es keine gibt, habe ich versucht, es selbst zu machen.
Die Syntax zum Hinzufügen von Tabellenkommentaren oder Spaltenkommentaren lautet wie folgt.
comment on table table_name is 'comment'
comment on column table_name.column_name is 'comment'
Dies ist jedoch eine proprietäre Spezifikation von Oracle und PostgreSQL (und DB2), und es scheint, dass es sich nicht um einen SQL-Standard handelt. Ich wünschte, ich könnte sqlite3 wenn möglich mit der gleichen Syntax erstellen, aber diesmal habe ich aufgegeben, weil es unmöglich erscheint. Zumindest möchte ich Oracle kommentieren, das ich normalerweise benutze.
Sie können es als normales Python-Modul erstellen, aber da es eine große Sache ist, erstellen Sie Ihren eigenen Django-Befehl, damit Sie es schnell über die Befehlszeile ausführen können. Bei Django-Befehlen können Sie durch Erben der AppCommand-Klasse das AppConfig-Objekt der Django-Anwendung als Argument erhalten, sodass Sie leicht eine Liste der Modelle zum Erstellen von Kommentaren abrufen können.
In Bezug auf die Erstellung von benutzerdefinierten Django-Befehlen habe ich auf den folgenden Artikel verwiesen.
Außerdem habe ich auf die Quelle von django.core.manegement.commands.sqlsequencereset verwiesen.
Der Befehlsname lautet "Tabellenkommentar erstellen". Das Format sollte wie folgt aussehen: ↓.
manage.py createtablecomment [options] <app_label app_label ...>
Da der diesmal erstellte Befehl nicht für eine bestimmte Anwendung gilt, legen Sie das Modul im Projektordner ab. (Das Folgende ist eine Referenz für die Platzierung. Der Projektname lautet "myproject".)
myproject
└ myproject
└ management
└ commands
└ createtablecomment.py
Mit Ausnahme des Inhalts von handle_app_config kopiere ich sqlsequencereset.py und verwende es fast so wie es ist.
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)
Der Verarbeitungsinhalt ist wie ↓.
app_config.get_models ()
und drehen Sie sie mit fürconnection.cursorl ()
undcursor.execute (Anweisung)
abrufen)model._meta.fields
und drehen Sie sie mit forIch habe versucht, es für meine App-Anwendung auszuführen, die models.py von ↓ hat.
models.py
from django.db import models
class Author(models.Model):
class Meta :
db_table = 'AUTHORS'
verbose_name = 'Autor'
verbose_name_plural = verbose_name
name = models.CharField('Name', max_length=50)
birthday = models.DateField('Geburtstag')
class BooK(models.Model):
class Meta:
verbose_name = 'Buch'
verbose_name_plural = verbose_name
name = models.CharField('Buchtitel', max_length=100)
price = models.IntegerField('Preis')
author = models.ForeignKey(Author, verbose_name='Autor')
Befehlsausführung
> python manage.py createtablecomment myapp
BEGIN;
COMMENT ON TABLE AUTHORS IS 'Autor'
COMMENT ON COLUMN AUTHORS.id IS 'ID'
COMMENT ON COLUMN AUTHORS.name IS 'Name'
COMMENT ON COLUMN AUTHORS.birthday IS 'Geburtstag'
COMMENT ON TABLE myapp_book IS 'Buch'
COMMENT ON COLUMN myapp_book.id IS 'ID'
COMMENT ON COLUMN myapp_book.name IS 'Buchtitel'
COMMENT ON COLUMN myapp_book.price IS 'Preis'
COMMENT ON COLUMN myapp_book.author_id IS 'Autor(FK:AUTHORS)'
COMMIT;
Die Kommentare wurden erfolgreich für die Tabellen und Spalten erstellt.
Recommended Posts