Python 3.x 请参阅SQLAlchemy生成的SQL CREATE TABLE语句,但不实际创建表

Python 3.x 请参阅SQLAlchemy生成的SQL CREATE TABLE语句,但不实际创建表,python-3.x,sqlalchemy,Python 3.x,Sqlalchemy,通过下面的代码片段,我可以使用SQL Alchemy轻松创建一个表,并查看实际生成的SQL“create Table”语句 from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, TIMESTAMP #engine = create_engine('sqlite:///sqlapi.db', echo = True) import testing.postgresql postgresql =

通过下面的代码片段,我可以使用SQL Alchemy轻松创建一个表,并查看实际生成的SQL“create Table”语句

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, TIMESTAMP
#engine = create_engine('sqlite:///sqlapi.db', echo = True)
import testing.postgresql
postgresql = testing.postgresql.Postgresql()
engine = create_engine(postgresql.url(), echo=True)

meta = MetaData()

alerts = Table(
   'alerts', meta,
   Column('id', Integer, primary_key = True),
   Column('name', String(255), nullable=False),
   Column('labeler', String(255)),
   Column('store', String(255)),
   Column('label', String(255)),
   Column('comment', String(255)),
)

meta.create_all(engine)
我的示例将结果打印如下:

2020-10-20 14:50:00,327 INFO sqlalchemy.engine.base.Engine select version()
2020-10-20 14:50:00,327 INFO sqlalchemy.engine.base.Engine {}
2020-10-20 14:50:00,329 INFO sqlalchemy.engine.base.Engine select current_schema()
2020-10-20 14:50:00,329 INFO sqlalchemy.engine.base.Engine {}
2020-10-20 14:50:00,331 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2020-10-20 14:50:00,331 INFO sqlalchemy.engine.base.Engine {}
2020-10-20 14:50:00,332 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2020-10-20 14:50:00,332 INFO sqlalchemy.engine.base.Engine {}
2020-10-20 14:50:00,333 INFO sqlalchemy.engine.base.Engine show standard_conforming_strings
2020-10-20 14:50:00,333 INFO sqlalchemy.engine.base.Engine {}
2020-10-20 14:50:00,334 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s
2020-10-20 14:50:00,334 INFO sqlalchemy.engine.base.Engine {'name': 'alerts'}
2020-10-20 14:50:00,337 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE alerts (
    id SERIAL NOT NULL, 
    name VARCHAR(255) NOT NULL, 
    labeler VARCHAR(255), 
    store VARCHAR(255), 
    label VARCHAR(255), 
    comment VARCHAR(255), 
    PRIMARY KEY (id)
)


2020-10-20 14:50:00,337 INFO sqlalchemy.engine.base.Engine {}
2020-10-20 14:50:00,343 INFO sqlalchemy.engine.base.Engine COMMIT

但是,有没有一种方法可以将CREATETABLE语句作为字符串获取,而无需在数据库中实际创建表并将其作为副作用获取?

下面的代码片段正是我想要的

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, TIMESTAMP
from sqlalchemy.schema import CreateTable
import psycopg2
#engine = create_engine('sqlite:///sqlapi.db', echo = True)
import testing.postgresql
postgresql = testing.postgresql.Postgresql()
engine = create_engine(postgresql.url())

meta = MetaData()

alerts = Table(
   'alerts', meta,
   Column('id', Integer, primary_key = True),
   Column('name', String(255), nullable=False),
   Column('labeler', String(255)),
   Column('store', String(255)),
   Column('label', String(255)),
   Column('comment', String(255)),
)

create_stmt = CreateTable(alerts).compile(engine)
print(create_stmt)