2015-10-23 20 views
10

補間されたSlick2 SQL文をデバッグ用に印刷しようとしています。Slickで補間されたSQLクエリを出力する

def query(name: String) = sql"SELECT MAX(age) FROM users WHERE name = $name".as[Int] 
println(query("Bob").getStatement) 

上記プリントこの:

SELECT MAX(age) FROM users WHERE name = 'Bob' 

注:この質問はからthis

+1

あなたが解決しようとしている問題は、厳密には関係がありません。滑らかなのは、JDBCレベルでプリペアドステートメントを作成し、そのように印刷されます。私は、あなたの注意をスリックに集中させるのではなく、JDBCプリペアドステートメントをどのように印刷するかを調べるべきだと思っています。私はそれがJDBCでそれを行う方法があるとは確信していません。 –

答えて

2

の重複はありません、私はそれがこれを印刷することができますどのように

SELECT MAX(age) FROM users WHERE name = ? 

slick documentation: "$の代わりに#$を使用して、リテラル値を挿入できます直接クエリに "。

//note the '#' 
def query(name : String) = sql"SELECT MAX(age) FROM users WHERE name = '#$name'".as[Int] 
+0

いいえ、私は '#$'をSQL文の一部(例えばテーブル名など)にスプライスすることは望ましくありません。これは 'where name = 'Bob'の代わりに' where name = Bob'を実行するので、間違ったSQLを生成します。変数をバインドするために '$ 'を使用したいと考えています... – pathikrit

+0

これは非プリミティブでは動作しません。例: ' def query(birthdate:LocalDate)= sql "SELECT MAX(age)FROM users birthday> $ birthdate" as [Int] ' ここでは、スコープに正しい暗黙的な値があれば、正しいSQLバインド変数に変換されます。 '#$'を使うと、私が望ましくないかもしれない 'LocalDate'の' .toString'を置くだけです。 – pathikrit

+0

適切なsqlを生成するために、クエリに単一引用符を追加しました。私はあなたがprintlnが "非プリミティブ"として表示されることを望むでしょうか、それらがSQLクエリに入ることができる値の唯一のタイプなので、わかりません。 –

3

あなたは、おそらくこれは、コンソールでコンパイルされたクエリ文字列を表示する必要があり

logger.scala.slick.session=DEBUG 

あなたのapplication.confに以下を追加します。

+0

私はPlayアプリを持っています。私はそれを私のapplication.confに加えて、私をlogger.xmlに追加しました: ''しかし、私はそれを見ません... – pathikrit

+0

logger.xmlでログレベルを "DEBUG"に変更するとどうなりますか? –

+0

同じです。私はDEBUGにも格下げしました。何もない。私はSlick 2.0 + Play 2.2の上にいます – pathikrit

関連する問題