You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可自动设置编解码器的asyncpg连接池?

解决asyncpg连接池自动注册编解码器的最优方案

直接用asyncpg连接池的init参数就能搞定——它接受一个异步函数,会在每个新连接建立后自动执行,刚好用来注册hstore、json、jsonb的内置编解码器,完全不用自定义连接类或者搞繁琐的上下文包装。

具体代码实现

import asyncpg

async def init_connection(conn):
    # 注册hstore编解码器
    await conn.set_builtin_type_codec(
        'hstore',
        codec_name='pg_catalog.hstore'
    )
    # 注册json编解码器
    await conn.set_builtin_type_codec(
        'json',
        codec_name='json'
    )
    # 注册jsonb编解码器
    await conn.set_builtin_type_codec(
        'jsonb',
        codec_name='jsonb'
    )

# 创建带初始化逻辑的连接池
async def create_db_pool():
    pool = await asyncpg.create_pool(
        user='你的用户名',
        password='你的密码',
        database='你的数据库',
        host='localhost',
        init=init_connection  # 核心:每个新连接都会自动跑这个异步初始化函数
    )
    return pool

为什么这方案最省心

  • 绕开连接类的限制:不用纠结构造函数不能调异步方法的问题
  • 全局生效:不管连接池是新建连接还是复用闲置连接(仅新创建的连接会触发init),所有可用连接都会提前注册好编解码器
  • 代码极简:只需要一个初始化函数,传入连接池即可,完全不用额外跟踪连接状态

验证示例

拿到连接后直接用对应类型就行,比如:

async def test_codecs():
    pool = await create_db_pool()
    async with pool.acquire() as conn:
        # 测试hstore
        hstore_result = await conn.fetchval("SELECT 'name=>张三, age=>25'::hstore")
        print(hstore_result)  # 直接输出Python字典:{'name': '张三', 'age': '25'}
        
        # 测试jsonb写入与读取
        await conn.execute("INSERT INTO test_json (data) VALUES ($1)", {"role": "admin", "perms": ["read", "write"]})
        jsonb_result = await conn.fetchval("SELECT data FROM test_json LIMIT 1")
        print(jsonb_result)  # 输出Python字典:{'role': 'admin', 'perms': ['read', 'write']}

内容的提问来源于stack exchange,提问作者nagylzs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:22:17