You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:57:02