aiopg + sqlalchemy:如何在没有原始 sql 的情况下 "drop table if exists"?

aiopg + sqlalchemy: how to "drop table if exists" without raw sql?

我正在查看 examples of aiopg usage with sqlalchemy,这些行吓到我了:

async def create_table(conn):
    await conn.execute('DROP TABLE IF EXISTS tbl')
    await conn.execute(CreateTable(tbl))

我不想在使用 sqlalchemy 时执行原始 sql 查询。但是我找不到任何其他方法来实现相同的逻辑。我的尝试是:

1)

await conn.execute(tbl.drop(checkfirst=True))

这引发了:

sqlalchemy.exc.UnboundExecutionError: Table object 'tbl' is not bound to an Engine or Connection. Execution can not proceed without a database to execute against.

我也找不到将 table 绑定到引擎的方法,因为 aiopg doesn't support metadata.create_all

2)

await conn.execute(DropTable(tbl))

这引发了:

psycopg2.errors.UndefinedTable: table "tbl" does not exist

似乎 DropTable 构造不支持 IF EXISTS 部分。

所以,问题是,在使用 aiopg + sqlalchemy 时,有没有什么方法可以将 await conn.execute('DROP TABLE IF EXISTS tbl') 语句重写成没有原始 sql 的东西?

这个问题是在最新版本为 SQLAlchemy 1.3.11 时发布的。

从 SQLAlchemy 1.4.0 开始,DropTable 支持 if_exists=True

await conn.execute(DropTable(tbl, if_exists=True))

参考:https://docs.sqlalchemy.org/en/14/core/ddl.html#sqlalchemy.schema.DropTable