首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步Connection.execute Pool.execute对Connection.execute

异步Connection.execute Pool.execute对Connection.execute
EN

Stack Overflow用户
提问于 2022-06-02 00:51:36
回答 1查看 658关注 0票数 2

从池中获取连接,然后在连接上调用execute,而不是直接调用池对象上的execute,用例是什么?

池子类的文档中,显示了以下示例:

代码语言:javascript
复制
con = await pool.acquire()
try:
    await con.execute(...)
finally:
    await pool.release(con)

从池中获取连接并用于执行语句。与直接在execute对象上调用Pool方法相比,这样做有什么好处,如下面所示?

代码语言:javascript
复制
async with asyncpg.create_pool(user=pg_user,
                               password=pg_pass,
                               host=pg_host,
                               port=pg_port,
                               database=pg_db,
                               command_timeout=60) as pool:
    pool.execute(f'TRUNCATE TABLE {table};')

Pool.execute的docs甚至声明如下:

执行SQL命令(或多个命令)。池使用它的一个连接执行此操作。除此之外,它的行为与Connection.execute()相同。

EN

回答 1

Stack Overflow用户

发布于 2022-06-02 15:13:41

从池中获取连接,然后在连接上调用execute而不是直接调用池对象的用例是什么?

当您显式地获得一个连接时,您可以启动一个事务并在事务中执行几个查询:

代码语言:javascript
复制
async def transfer_money(pool, from_id, to_id, amount):
    async with pool.acquire() as conn:
        async with conn.transaction():
            await conn.execute(
                "UPDATE balance SET money = money + $2 WHERE user_id = $1",
                to_id, amount
            )
            await conn.execute(
                "UPDATE balance SET money = money - $2 WHERE user_id = $1",
                from_id, amount
            )

如果你这么做了

代码语言:javascript
复制
async def transfer_money(pool, from_id, to_id, amount):
    await pool.execute(
        "UPDATE balance SET money = money + $2 WHERE user_id = $1",
        to_id, amount
    )
    await pool.execute(
        "UPDATE balance SET money = money - $2 WHERE user_id = $1",
        from_id, amount
    )

它将是以下几个方面的速记:

代码语言:javascript
复制
async def transfer_money(pool, from_id, to_id, amount):
    async with pool.acquire() as conn:
        await conn.execute(
            "UPDATE balance SET money = money + $2 WHERE user_id = $1",
            to_id, amount
        )
    async with pool.acquire() as conn:
        await conn.execute(
            "UPDATE balance SET money = money - $2 WHERE user_id = $1",
            from_id, amount
        )

例如,如果程序在第一个查询后崩溃,一个用户将得到钱,而另一个用户不会丢失它。换句话说,函数不会是原子的(中的"A“)

Pool.execute是如何实现的(GitHub链路):

代码语言:javascript
复制
    async def execute(self, query: str, *args, timeout: float=None) -> str:
        async with self.acquire() as con:
            return await con.execute(query, *args, timeout=timeout)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72469472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档