从mysqlclient迁移至mysql-connector-python时,字面量%s的查询兼容方案求助
解决mysql-connector-python中字面量%s的写入问题
针对你从mysqlclient迁移到mysql-connector-python时遇到的字面量%s无法通过%%s转义的问题,除了将%s作为参数绑定外,还有以下几种实用方案:
使用MySQL字符串拼接函数生成字面量
把%和s拆分开,通过MySQL的CONCAT函数在数据库端拼接成%s,这样连接器不会识别到完整的%s占位符:cursor.execute('INSERT INTO foo(bar, baz) VALUES (CONCAT(\'%\', \'s\'), %s)', ('abc',))用十六进制编码直接写入
%的ASCII码是37(十六进制25),s的ASCII码是115(十六进制73),直接在SQL中使用十六进制值0x2573,MySQL会自动转换为字符串%s:cursor.execute('INSERT INTO foo(bar, baz) VALUES (0x2573, %s)', ('abc',))切换参数占位符风格
mysql-connector-python支持多种参数占位符风格,比如将默认的pyformat(%s)切换为qmark(?)或format({}),这样原SQL中的%s就会被当作字面量处理:# 设置游标参数风格为qmark cursor = conn.cursor(paramstyle='qmark') # 使用?作为参数占位符,%s作为字面量 cursor.execute('INSERT INTO foo(bar, baz) VALUES (\'%s\', ?)', ('abc',))注意:这个方案需要统一修改所有查询的占位符格式,适合大规模迁移场景。
内容的提问来源于stack exchange,提问作者jph
相关产品推荐
相关产品推荐

