web-dev-qa-db-ja.com

slickでsql "" "補間を使用して動的SQLクエリを作成する方法

私はScalaとSlickに不慣れで、Slick補間を使用してプレーンSQLクエリを作成しようとしています。

ケース1:クエリが定数として格納されるように、コードを一般化する必要があります。

例えば:

val SQL_ALL_TABLE_METADATA: String = """SELECT DISTINCT table_name, column_name, data_type
                                            FROM information_schema.columns
                                                    WHERE table_schema = 'apollo' OR table_schema = 'dpa' ORDER BY table_name""";

そして、次のような定数からプレーンクエリを作成します

var plainQuery = sql"""$SQL_ALL_TABLE_METADATA""".as[List[String]]

ケース2:クエリの一部を置き換える

例:テーブル 'table1'から列f_nameに関する情報を取得します

var column= "f_name"
var plainQuery = sql"""SELECT $column FROM table1""".as[String]

上記のケースを試してみると、クエリがコンパイル時に静的にバインドされているように見えるため、機能しません。

今のところ、プレーンSQLを使用し、将来的には高度なSlickAPIを使用したいことに注意してください。

17
John

ケース1

なぜこれを持っていないのですか?

val SQL_ALL_TABLE_METADATA: StaticQuery = sql"""SELECT DISTINCT table_name, column_name, data_type
                                            FROM information_schema.columns
                                                    WHERE table_schema = 'apollo' OR table_schema = 'dpa' ORDER BY table_name"""

var plainQuery = SQL_ALL_TABLE_METADATA.as[List[String]]

ケース2

- 使用する #$ の代わりに $

var column= "f_name"
var plainQuery = sql"""SELECT #$column FROM table1""".as[String]
16
Dimitri

補間を使用していない回答を投稿しています。誰かが役立つと思うかもしれません。

テストでそのように解決しました。executeUpdateメソッドはクエリの実際の結果を返します。 String変数から動的クエリを実行できました。

dbConnection = JdbcBackend.Database.forURL(url = dbConfig.getString("db.url"), driver = "org.h2.Driver")
val createTablesSqlQuery:String = //read_from_file
dbConnection.createSession().createStatement().executeUpdate(createTablesSqlQuery)

役立つトピックはこれでした: https://groups.google.com/forum/#!topic/scalaquery/OxAgtcCPMyg

0
Łukasz Gawron