2017-09-21 65 views
1

PostgresのCOMMENT ONステートメントを準備することはできますか?準備されたステートメントを使用してPostgreSQLのテーブルコメントを作成する

ユーザーがテーブルを作成できるプログラムがあります。私は彼らにテーブルの内容の説明を追加するオプションを与えたいと思います。このデータはユーザーからのものであるため、私は準備済みのステートメントを使用したいと思います。ルビーと「pg」宝石を使用して

、私はセットアップに以下の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文字列の操作に頼るべきです。それが事実ですが、これについて最善の方法は何ですか?データは敏感でも批判的でもなく、正しく表現された引用符とアポストロフィに関心があります。

ありがとうございます。

答えて

0

値であるとそれを表示されないと仮定ありえない。

私は古い "double single quotes"メソッドを使いました。

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

これは本当にハッキリです。しかし、今のところそれを答えとしてマークしています。

より安全な方法がある場合は、お知らせください。

0

私はルビーは、postgresの、which does it for

どれSELECT、INSERT、UPDATEと同じ文をサポートDELETE、またはステートメント

ないCOMMENT IS

+0

私は多くの疑念を抱いていますが、ドキュメントへのリンクをありがとうと非常に役に立ちます。 – Nossidge

関連する問題