libpqにおけるSQLエスケープについて
from pgでSQLを実行するいくつかの方法
#下書き
多分あんまり使うことはない。
pg gemでの例:
code:escape.rb
require 'pg'
conn = PG::Connection.open(:dbname => 'test')
str = "('-') (;_;)"
value = PG::Connection.escape_string(str)
res = conn.exec("SELECT #{value}")
# こういう場合は、プレースホルダーを使った方が良さそう
PQescapeLiteral
SQLコマンド内で使用する文字列をエスケープ
SQLコマンド内で、リテラル定数としてデータの値を入れる時に役立つ
https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-PQESCAPELITERAL
PQexecParamsまたは同義のルーチン内で別のパラメータとしてデータ値が渡される場合は、エスケープすることは必要でもなければ正しくもないことに注意してください。
https://www.postgresql.jp/document/13/html/libpq-exec.html#LIBPQ-PQESCAPELITERAL
pg gemのメソッド:escape_literal
https://deveiate.org/code/pg/PG/Connection.html#method-i-escape_literal
PQescapeIdentifier
SQL識別子(テーブル、列、関数名など)として使用する文字列をエスケープ
https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-PQESCAPEIDENTIFIER
https://www.postgresql.jp/document/13/html/libpq-exec.html#LIBPQ-PQESCAPEIDENTIFIER
pg gemのメソッド:escape_identifier
https://deveiate.org/code/pg/PG/Connection.html#method-i-escape_identifier
PQescapeStringConn
PQescapeLiteralとほぼ同様に文字列リテラルをエスケープ
https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-PQESCAPESTRINGCONN
https://www.postgresql.jp/document/13/html/libpq-exec.html#LIBPQ-PQESCAPESTRINGCONN
pg gemのメソッド:escape_string
https://deveiate.org/code/pg/PG/Connection.html#method-i-escape_string
PQescapeByteaConn
bytea型としてSQLコマンド内で使用するバイナリデータをエスケープ
pg gemのメソッド:escape_bytea
https://deveiate.org/code/pg/PG/Connection.html#method-i-escape_bytea
参考URL
33.3.4. SQLコマンドに含めるための文字列のエスケープ処理
4.1. 字句の構造
ruby-pg/pg_connection.c at master · ged/ruby-pg
#pgでSQLを実行するいくつかの方法