使用Ruby PG Gem执行CREATE DATABASE时出现near "$1"语法错误
根本原因
PostgreSQL 仅允许在*数据操作类语句(DML,包含 SELECT/INSERT/UPDATE/DELETE 等)*中使用 $1 格式的参数占位符,CREATE DATABASE 属于数据定义类语句(DDL),属于 PostgreSQL 不支持参数绑定的工具类语句范畴,服务端本身不接收这类语句的参数传入,因此会直接报语法错误。
你使用的 SELECT * FROM pg_database WHERE datname = $1 属于标准 DML 语句,WHERE 条件中的值匹配场景完全支持参数占位符,因此可以正常执行。
解决方案
- 不要尝试用
exec_params执行带参数的CREATE DATABASE语句,必须拼接 SQL 语句,同时要严格规避 SQL 注入风险 - 拼接前先对库名字段做严格校验:仅允许字母、数字、下划线三类字符,长度不超过 PostgreSQL 标识符的最大限制(63字节)
- 也可以调用 PostgreSQL 内置的
quote_ident函数对库名做标识符转义后再拼接进 SQL 语句,参考写法:
# 先对库名做安全转义 escaped_db_name = conn.exec("SELECT quote_ident($1)", [table_name]).getvalue(0,0) # 再拼接执行建库语句 res = conn.exec("CREATE DATABASE #{escaped_db_name}")
内容的提问来源于stack exchange,提问作者Akash Chourasia
相关产品推荐
相关产品推荐

