[PYTHON] Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben

Einführung

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.

Syntax für Tabellenkommentare / Spaltenkommentare

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.

Benutzerdefinierte Django-Befehle erstellen

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.

Befehlsformat

Der Befehlsname lautet "Tabellenkommentar erstellen". Das Format sollte wie folgt aussehen: ↓.

manage.py createtablecomment [options] <app_label app_label ...>

Modulplatzierung für Befehle

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

Befehlsklassenquelle

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 ↓.

  1. Holen Sie sich die Modellklassenliste unter der App mit app_config.get_models () und drehen Sie sie mit für
  2. Erstellen und Ausführen einer Kommentaranweisung für Tabelle erstellen (Cursor mit connection.cursorl () undcursor.execute (Anweisung)abrufen)
  3. Holen Sie sich die Liste der Felder, die das Modell hat, mit model._meta.fields und drehen Sie sie mit for
  4. Erstellen Sie eine Anweisung zum Erstellen eines Kommentars für die Spalte und führen Sie sie aus. (Füllen Sie das Feld "ForeignKey" aus, wenn dem Spaltennamen "_id" hinzugefügt wird. Fügen Sie außerdem die Information "Welche Tabelle ist die FK?" Zum Kommentar hinzu.)
  5. Erstellen Sie die Liste der ausgeführten Anweisungen zum Erstellen von Kommentaren in Zeichenfolgen, die durch Zeilenumbrüche getrennt sind, und geben Sie sie zurück (wenn der Befehl von der Konsole ausgeführt wird, wird die ausgeführte SQL-Anweisung an die Konsole ausgegeben).

Ausführungsergebnis

Ich 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

Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Ich habe ein Plugin erstellt, um mit Vim eine Markdown-Tabelle aus CSV zu generieren
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Ich habe einen Befehl gegeben, auf den Start von Django zu warten, bis die Datenbank bereit ist
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
Ich habe ein Tool erstellt, um automatisch ein einfaches ER-Diagramm aus der Anweisung CREATE TABLE zu generieren
Ich habe ein Ausgabeprogramm für Primzahlentabellen in verschiedenen Sprachen erstellt
Ich möchte in der Einschlussnotation drucken
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe eine WEB-Bewerbung bei Django gemacht
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe ein CLI-Tool erstellt, um Bilder in jedem Verzeichnis in PDF zu konvertieren
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Es wurde eine Funktion hinzugefügt, um gewünschte Verschiebungen in der Django-Verschiebungstabelle zu registrieren
Ich habe ein Skript in Python erstellt, um MDD-Dateien in das Scrapbox-Format zu konvertieren
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Hinweise Ich habe nachgeschlagen, um Befehlszeilentools in Python zu erstellen
Ich möchte Datetime.now in Djangos Test reparieren
Ich möchte mit Python ein Fenster erstellen
Ich habe ein Tool erstellt, um Hy nativ zu kompilieren
Ich habe versucht, eine zufällige Zeichenfolge zu generieren
Ich habe ein Tool erstellt, um neue Artikel zu erhalten
So erstellen Sie eine Rest-API in Django
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Ich möchte eine Django-App auf Heroku hochladen
Ich habe versucht, automatisch eine Portverwaltungstabelle aus L2SW Config zu generieren
Ich habe ein Modul in C-Sprache erstellt, das von Python geladene Bilder filtert
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
〇✕ Ich habe ein Spiel gemacht
Ich möchte Timeout einfach in Python implementieren
Ich möchte mit einem Knopf am Kolben übergehen
Ich habe eine Bibliothek erstellt, um japanische Sätze schön zu brechen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich habe einen Code erstellt, um illustration2vec in ein Keras-Modell zu konvertieren
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
So zeigen Sie DataFrame als Tabelle in Markdown an
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
So führen Sie einen Befehl mit einem Unterprozess in Python aus
So verweisen Sie auf statische Dateien in einem Django-Projekt
Ich habe einen Vim-ähnlichen Ersetzungsbefehl in Slackbot #Python implementiert
Ich kann nicht schlafen, bis ich einen Server erstellt habe !! (Einführung in den Python-Server an einem Tag)
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Ich habe ein Skript in Python erstellt, um eine Textdatei für JSON zu konvertieren (für das vscode-Benutzer-Snippet).
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Benennen Sie Tabellenspalten in Django3 um