【发布时间】:2020-03-15 23:50:11
【问题描述】:
我在看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: 表对象 'tbl' 不是 绑定到引擎或连接。没有 a 就无法执行 要执行的数据库。
我也找不到将表绑定到引擎的方法,因为aiopg doesn't support metadata.create_all
2)
await conn.execute(DropTable(tbl))
这引发了:
psycopg2.errors.UndefinedTable:表“tbl”不存在
似乎DropTable 构造无论如何都不支持IF EXISTS 部分。
所以,问题是,在使用 aiopg + sqlalchemy 时,有没有办法将 await conn.execute('DROP TABLE IF EXISTS tbl') 语句重写为没有原始 sql 的东西?
【问题讨论】:
-
通常
Table.drop()接受可选的绑定作为第一个位置参数,所以你会像tbl.drop(conn, checkfirst=True)一样传递conn,但我不知道异步是否支持。顺便说一句。在使用 SQLAlchemy 时执行实际的 SQL 没有错,它甚至提供了一些帮助,例如text()。 -
抓到
UndefinedTable有什么问题? -
@AndreaCorbellini 执行此查询将需要 4 行(尝试、执行、除外、通过),甚至比使用原始 sql 还要糟糕。我正在寻找最好的(最短,最 Pythonic)的方式来做到这一点。我希望 sqlalchemy 能够为此类简单查询提供内置功能。
标签: python postgresql sqlalchemy drop-table aiopg