使用准备好的语句创建 PostgreSQL table 注释

Create PostgreSQL table comment using a prepared statement

是否可以准备 Postgres 'COMMENT ON' 语句?

我有一个允许用户创建 table 的程序。我想让他们选择添加 table 内容的描述。由于此数据来自用户,我想使用准备好的语句。

使用 Ruby 和“pg”gem,我使用以下设置 Postgres 连接和示例数据:

table_name  = "test_shakespeare"
description = "Shakespeare's sonnets"

con = PG.connect(
  :dbname   => "poefy",
  :user     => "poefy",
  :password => "poefy"
)

sql = "CREATE TABLE #{table_name} (example TEXT);"
con.exec(sql)

这是我失败的方法,以及它们抛出的错误。

# ERROR:  syntax error at or near "" (PG::SyntaxError)
sql = "COMMENT ON TABLE #{table_name} IS ;"
con.exec(sql, [*description])

# ERROR:  syntax error at or near "" (PG::SyntaxError)
sql = "COMMENT ON TABLE #{table_name} IS ;"
con.prepare("comment", sql)
con.exec_prepared("comment", [*description])

# ERROR:  could not determine data type of parameter  (PG::IndeterminateDatatype)
sql = "COMMENT ON TABLE #{table_name} IS '';"
con.exec(sql, [*description])

# ERROR:  bind message supplies 1 parameters, but prepared statement "comment" requires 0 (PG::ProtocolViolation)
sql = "COMMENT ON TABLE #{table_name} IS '';"
con.prepare("comment", sql)
con.exec_prepared("comment", [*description])

这种语句似乎无法准备,我应该求助于SQL字符串操作。既然如此,解决这个问题的最佳方法是什么?数据既不敏感也不重要,我只关心正确表示的引号和撇号。

提前致谢。

我假设 ruby 支持与 postgres 相同的语句,which does it for

Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement

不是COMMENT IS

看来这是不可能的。

所以我采用了旧的 "double all the single quotes" 方法。

safe_desc = description.gsub("'", "''")
con.exec "COMMENT ON TABLE #{table_name} IS '#{safe_desc}';"

这感觉真的很老套。但现在我将其标记为答案。

如果有更安全的方法,请告诉我。