使用Python向Clickhouse插入数据时如何处理单引号问题?
ClickHouse插入含单引号数据报错的解决方法
向ClickHouse插入包含单引号的字符串时,直接拼接SQL语句会触发语法解析错误,出现类似以下的报错:
ServerException: Code: 47.
DB::Exception: Missing columns: 'A'BCD' while processing query: 'A'BCD', required columns: 'A'BCD' 'A'BCD' : While executing ValuesBlockInputFormat.
错误原因
不管是直接用f-string拼接(示例1),还是用repr()处理后拼接(示例2),最终生成的SQL语句里,字符串A'BCD都会被解析成'A'BCD'——ClickHouse会把第一个单引号后的A当成字符串值,紧接着的单引号被误认为SQL语句的结束符,后面的BCD就被当成了列名,从而报“缺少列”的错误。
正确解决方法:使用参数化查询
不要手动拼接SQL语句,利用ClickHouse客户端的参数化查询功能,让客户端自动处理字符串转义:
from clickhouse_driver import Client client = Client('localhost') tmp_list = ['A\'BCD','12345','1a2a3a4a'] # 单值多行插入的参数化写法 insert_sql = 'INSERT INTO tmp_table (NAME) VALUES (?), (?), (?)' client.execute(insert_sql, tmp_list) # 或者批量构造数据行的写法(更适合大量数据) data_rows = [(item,) for item in tmp_list] insert_sql = 'INSERT INTO tmp_table (NAME) VALUES' client.execute(insert_sql, data_rows)
参数化查询不仅能彻底解决单引号转义问题,还能避免SQL注入风险,是操作数据库时的标准安全做法。
内容的提问来源于stack exchange,提问作者chapy
相关产品推荐
相关产品推荐

