AWS lambdaでsqlを直書きするとき、prepared statementで書かないとNGだった件
概要
AWS lambdaのSELECT文の中で、値を直接代入する書き方をしていたが、動かなかった。
SQLを書くときはprepared statementで書かないとダメだった。
詳細
AWS lambdaのSELECT文の中で、値を直接代入する書き方をしていたが、動かなかった。
以下のような感じで、関連するIoT Deviceの情報を探してくるSQLを書いていました。
AWS lambda/index
text: `SELECT * FROM devices WHERE devices.name = "${ device_name }"`,
動かそうとしても、動きませんでした。
ポイントとしては、devices.nameのところに、device_nameを変数展開して、直接代入しようとしている部分です。
SQLを書くときはprepared statementで書かないとダメだった。
結局どのような書き方で動いたかというと、以下のような感じです。
AWS lambda/index
text: `SELECT * FROM devices WHERE name = $1`,
values: [device_name]
この書き方、あるのは知っていたのですが、名前は知りませんでした。
prepared statemantという書き方らしく、以下のようなメリットがあるそうです。
プリペアドステートメント 【prepared statement】プリペアドステートメントとは、プログラム上で動的にSQL文を生成する必要があるとき、可変部分を変数のようにしたSQL文をあらかじめ作成しておき、値の挿入は処理系に行わせる方式。 実行効率を向上させ、SQLインジェクションを防止する効果がある。
いやはや、、、
しかも、このprepared statementを使わないと、挙動しないような仕組みもあるみたいです。。。
値を直接代入できないようにしているということですね、、、
AWS lambdaもそんなのあるんでしょうか、、、
調べないといけないですね、、、
では。