Redux(react-redux)における適切な配列要素の更新
2021年8月23日…
MySQLの場合は文字列を表現する場合には、シングルクォートまたはダブルクォートのどちらかで対象文字列を囲う。PostgreSQLでは、これが厳密にシングルクォートとまず決まっている(ダブルクォートで囲ってもエラーになる)。例えば、Node.jsとbrianc/node-postgres(pg)をで下記のようなクエリのコードを書いただけではエラーになってしまう。
let [name,email] = ['mmiyauchi','[email protected]']; let profile = `こんにちは!私はJavaScriptがわりと好きです!('-')b`; const query = `INSERT INTO member (name, email, profile) VALUES ('${name}', '${email}', '${profile}')`;
時期的に、そろそろES6でも良いかなと思っているので、このブログで紹介するコードも基本的にはES6のシンタックスで取り扱うこととする。もし、読みにくい場合はBabel公式のこちらのトランスパイラでES5コードに変換して確認して欲しい。ということで、問題はコードのハイライト箇所の2行目である。シングルクォートなんて、ソースコード以外、あまりテキストに出てこないということだろう。そういうわけで、クローリングだったり、未知のテキストをPostgreSQLに放り込むというという時に顔文字なんかが当たって、エラーを引き起こすことがある(まさに実際に顔文字でこの事態になり、シングルクォートがテキストデータ内にあり、悪さをしていたことにようやく気付いた)。
PostgreSQLの推進団体Let’s Postgres公式サイトのこちらのページによると、テキスト中のシングルクォートのエスケープについては下記のように説明されている。
SQL標準で定義されているエスケープ方法は、単純に1つのシングルクォートを2つに重ねることです
前述のように、通常はシングルクォートが1つあれば、シングルクォートを2つに置換してエスケープする方法が推奨されている。というわけで、実際のJavaScriptコードで、エスケープ処理を加えたコード例を下記に示す。
//シングルクォートが1つあればシングルクォートを2つ(double)に置換する関数 const doubleSingleQuote = (text) => { const regex = /\'/; let fixedText = ''; if (regex.test(text)) { text = text.toString(); fixedText = text.replace(/\'/g, '\'\''); return fixedText; } else { return text; } }; let [name,email] = ['mmiyauchi','[email protected]']; let profile = `こんにちは!私はJavaScriptがわりと好きです!('')b`; //文字列を格納する変数に全てついてシングルクォートのエスケープ処理をする name = doubleSingleQuote(name); email = doubleSingleQuote(email); profile = doubleSingleQuote(profile); const query = `INSERT INTO member (name, email, profile) VALUES ('${name}', '${email}', '${profile}')`;
上記シングルクォートのエスケープ処理については、簡単な正規表現で低コストで実装できる。おそらく大体似たような処理になると思うが、参考までに共有であった。
プログラムを書きながらTranceを聴くのが良いですね。みなさんも聴いたほうがいいですよ、Trance。EDMよりハードトランスでしょ。
Discussion about this post