使用asyncpg插入含大括号的数据遇语法错误,如何解决?
问题修复方案
错误原因
你直接用f-string拼接SQL语句,导致{H}被直接插入到SQL中,生成的语句是:
insert into raw_data (param, raw_data) values (1000, {H})
这不符合PostgreSQL语法:一是字符串未加引号,二是大括号被解析为非法SQL语法。同时这种拼接方式存在严重的SQL注入风险。
正确解决方案:使用参数化查询
asyncpg推荐使用参数化查询来处理动态数据,它会自动处理特殊字符转义和语法格式,彻底避免这类问题。
步骤1:修正字段名
你的数据表字段是param_id,但SQL中写的是param,先修正这个字段名错误。
步骤2:改写为参数化查询
两种常见写法:
写法1:位置参数($1, $2)
app['bd_conn'] = await asyncpg.create_pool(host=os.environ.get('DB_HOST'), database=os.environ.get('DB_NAME'), user=os.environ.get('DB_USER'), password=os.environ.get('DB_PASS'), max_size=5, min_size=1) db_engine = app['bd_conn'] raw_data = "{H}" param = "1000" async with db_engine.acquire() as conn: stmt = """ insert into raw_data (param_id, raw_data) values ($1, $2) """ # 用execute执行INSERT语句,而非fetch(fetch用于查询结果) await conn.execute(stmt, param, raw_data)
写法2:命名参数
async with db_engine.acquire() as conn: stmt = """ insert into raw_data (param_id, raw_data) values ($param_id, $raw_data) """ await conn.execute(stmt, param_id=param, raw_data=raw_data)
额外提示
- INSERT语句应该用
execute方法执行,fetch方法适用于SELECT类需要返回结果的查询。 - 你的
datetime字段类型是varchar,但默认值用了now(),建议改为timestamp类型更符合时间数据的存储规范。
内容的提问来源于stack exchange,提问作者sportul
相关产品推荐
相关产品推荐

