使用预准备语句创建PostgreSQL表注释

时间:2017-09-21 10:53:23

标签: sql ruby postgresql sql-injection

是否可以准备Postgres'COMMENT ON'声明?

我有一个允许用户创建表的程序。我想给他们添加表格内容描述的选项。由于这些数据来自用户,我想使用准备好的语句。

使用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 "$1" (PG::SyntaxError)
sql = "COMMENT ON TABLE #{table_name} IS $1;"
con.exec(sql, [*description])

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

# ERROR:  could not determine data type of parameter $1 (PG::IndeterminateDatatype)
sql = "COMMENT ON TABLE #{table_name} IS '$1';"
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 '$1';"
con.prepare("comment", sql)
con.exec_prepared("comment", [*description])

似乎这种类型的语句不可能进行准备,我应该采用SQL字符串操作。既然如此,最好的方法是什么?数据不敏感或不重要,我只关心正确表示的引号和撇号。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为ruby支持与postgres which does it for

相同的语句
  

任何SELECT,INSERT,UPDATE,DELETE或VALUES语句

不是COMMENT IS

答案 1 :(得分:0)

看来这是不可能的。

所以我选择了旧的“双引号单引号”方法。

min-height: 100%

这真的很酷。但是现在我把它标记为答案。

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