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的内容?
这个问题是在最新版本是 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