Slick: przeszukuj wiele tabel / baz danych, pobierając nazwy kolumn
Mam w mojej aplikacji Play metody, które sprawdzają tabele bazy danych z ponad stu kolumnami. Nie mogę zdefiniować klasy przypadku dla każdego takiego zapytania, ponieważ byłoby to po prostu śmiesznie duże i musiałoby zostać zmienione przy każdej zmianie tabeli w bazie danych.
Korzystam z tego podejścia, gdzie wynik zapytania wygląda tak:
Map(columnName1 -> columnVal1, columnName2 -> columnVal2, ...)
Przykład kodu:
implicit val getListStringResult = GetResult[List[Any]] (
r => (1 to r.numColumns).map(_ => r.nextObject).toList
)
def getSomething(): Map[String, Any] = DB.withSession {
val columns = MTable.getTables(None, None, None, None).list.filter(_.name.name == "myTable").head.getColumns.list.map(_.column)
val result = sql"""SELECT * FROM myTable LIMIT 1""".as[List[Any]].firstOption.map(columns zip _ toMap).get
}
Nie jest to problem, gdy zapytanie działa tylko na jednej bazie danych i pojedynczej tabeli. W moim zapytaniu muszę mieć możliwość używania wielu tabel i baz danych:
def getSomething(): Map[String, Any] = DB.withSession {
//The line below is no longer valid because of multiple tables/databases
val columns = MTable.getTables(None, None, None, None).list.filter(_.name.name == "table1").head.getColumns.list.map(_.column)
val result = sql"""
SELECT *
FROM db1.table1
LEFT JOIN db2.table2 ON db2.table2.col1 = db1.table1.col1
LIMIT 1
""".as[List[Any]].firstOption.map(columns zip _ toMap).get
}
Tego samego podejścia nie można już używać do pobierania nazw kolumn. Ten problem nie występuje, gdy używa się czegoś takiego jak PHP PDO lub Java JDBCTemplate - te pobierają nazwy kolumn bez dodatkowego wysiłku.
Moje pytanie brzmi: jak to osiągnąć za pomocą Slicka?