Как я могу напечатать определения схемы / таблицы в SQLAlchemy - PullRequest
0 голосов
/ 03 июля 2019

как мне распечатать схему всех таблиц, используя sqlalchemy?

вот как я это делаю, используя sqlite3: я запускаю SQL, чтобы распечатать схему всех таблиц в базе данных:

import sqlite3
conn = sqlite3.connect("example.db")
cur = conn.cursor()

rs = cur.execute(
    """
    SELECT name, sql FROM sqlite_master
    WHERE type='table'
    ORDER BY name;
    """)

for name, schema, *args in rs:
    print(name)
    print(schema)
    print()

с выводом, который может выглядеть следующим образом:

albums
CREATE TABLE "albums"
(
    [AlbumId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [Title] NVARCHAR(160)  NOT NULL,
    [ArtistId] INTEGER  NOT NULL,
    FOREIGN KEY ([ArtistId]) REFERENCES "artists" ([ArtistId]) 
        ON DELETE NO ACTION ON UPDATE NO ACTION
)

artists
CREATE TABLE "artists"
(
    [ArtistId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [Name] NVARCHAR(120)
)

есть ли способ сделать это с помощью чистых sqlalchemy вызовов API, что-то лучше этого?

metadata = sqlalchemy.MetaData()
metadata.reflect(engine)
insp = sqlalchemy.inspect(engine)

for table_name in metadata.tables:
    print(table_name)
    for column in insp.get_columns(table_name):
        for name,value in column.items():
            print('  ', end='')
            if value:
                field = name if value in [True, 'auto'] else value 
                print(field, end=' ')
        print()

выход:

albums
  AlbumId   INTEGER       autoincrement   primary_key 
  Title   NVARCHAR(160)       autoincrement   
  ArtistId   INTEGER       autoincrement   

artists
  ArtistId   INTEGER       autoincrement   primary_key 
  Name   NVARCHAR(120)   nullable     autoincrement   

1 Ответ

1 голос
/ 03 июля 2019

Этот бит в документации по SQLAlchemy может помочь: они предлагают сделать следующее:

def dump(sql, *multiparams, **params):
    print(sql.compile(dialect=engine.dialect))
engine = create_engine('postgresql://', strategy='mock', executor=dump)
metadata.create_all(engine, checkfirst=False)
...