aiopg + sqlalchemy:如何在没有原始sql的情况下“删除表(如果存在)”?

san*_*ash 7 python postgresql sqlalchemy drop-table aiopg

我正在看sqlalchemy的aiopg用法示例,这些行使我感到恐惧:

async def create_table(conn):
    await conn.execute('DROP TABLE IF EXISTS tbl')
    await conn.execute(CreateTable(tbl))
Run Code Online (Sandbox Code Playgroud)

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

1)

await conn.execute(tbl.drop(checkfirst=True))
Run Code Online (Sandbox Code Playgroud)

这引起了:

sqlalchemy.exc.UnboundExecutionError:表对象“ tbl”未绑定到引擎或连接。没有要执行的数据库,执行将无法进行。

我也找不到将表绑定到引擎的方法,因为aiopg不支持元数据。

2)

await conn.execute(DropTable(tbl))
Run Code Online (Sandbox Code Playgroud)

这引起了:

psycopg2.errors.UndefinedTable:表“ tbl”不存在

似乎DropTable构造不IF EXISTS以任何方式支持部分。

因此,问题是,await conn.execute('DROP TABLE IF EXISTS tbl')使用aiopg + sqlalchemy时,有没有办法将语句重写为没有原始sql的内容?

aar*_*ron 5

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

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

await conn.execute(DropTable(tbl, if_exists=True))
Run Code Online (Sandbox Code Playgroud)

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