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
我正在查看 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