aws_s3.query_export_to_s3带WHERE字符串条件语法错误求助
解决psycopg2调用aws_s3.query_export_to_s3时字符串条件的语法错误
问题出在SQL语句的引号嵌套冲突,不是query_export_to_s3无法处理字符串条件。你的内部SELECT语句用单引号包裹字符串text1,而外层又用单引号包裹整个内部SELECT,导致数据库解析时提前闭合了内部查询,把text1当成了无效SQL语法。
解决方案一:转义内部单引号
PostgreSQL中,字符串内部的单引号需要用两个连续单引号转义,修改后的代码:
query = "SELECT * FROM aws_s3.query_export_to_s3('SELECT * from sample WHERE name=''text1''', 's3-bucket-name', 'file-path')"
把'text1'替换为''text1'',让数据库正确识别这是内部查询的字符串值。
解决方案二:用psycopg2参数化查询(推荐,防SQL注入)
直接拼接字符串易出错且有注入风险,用psycopg2的参数绑定功能处理:
import psycopg2 # 建立数据库连接 conn = psycopg2.connect( dbname="your_db", user="your_user", password="your_pwd", host="your_host" ) cur = conn.cursor() # 定义内部查询模板和参数 inner_query_template = "SELECT * from sample WHERE name = %s" target_name = "text1" # 生成参数化的内部查询 param_inner_query = inner_query_template % target_name # 构造完整的导出查询,用%L转义内部查询为字符串字面量 full_export_query = cur.mogrify( "SELECT * FROM aws_s3.query_export_to_s3(%L, %s, %s)", (param_inner_query, "s3-bucket-name", "file-path") ) # 执行并提交 cur.execute(full_export_query) conn.commit() # 关闭连接 cur.close() conn.close()
这种方式既解决了引号嵌套问题,又避免了SQL注入,比手动转义更安全可靠。
补充说明
之前数字类型能正常运行,是因为数字不需要引号包裹,不会触发引号嵌套冲突,和query_export_to_s3本身的功能无关。
内容的提问来源于stack exchange,提问作者jayprakash pateriya
相关产品推荐
相关产品推荐

