如何在 SQLAlchemy 中打印模式/table 定义

How can I print schema / table definitions in SQLAlchemy

如何使用 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   

This bit in the SQLAlchemy docs 可能有帮助:他们建议这样做:

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)