9

私はScalaQueryを試しています、それは本当に素晴らしいです。Scalaクラスを使用してデータベーステーブルを定義し、簡単にクエリを実行できました。

しかし、次のコードで、テーブルが存在するかどうかを確認するにはどうすればよいのでしょうか。このプログラムを2回実行すると、「Table.ddl.create」を2回呼び出して、例外が発生することはありません。

object Users extends Table[(Int, String, String)]("Users") {
    def id = column[Int]("id")
    def first = column[String]("first")
    def last = column[String]("last")
    def * = id ~ first ~ last
}

object Main
{
    val database = Database.forURL("jdbc:sqlite:sample.db", driver = "org.sqlite.JDBC")

    def main(args: Array[String]) {
        database withSession {
            // How could I know table Users is alrady in the DB?
            if ( ??? )  {
                Users.ddl.create
            }
        }
    }
}
4

6 に答える 6

8

ScalaQuery バージョン 0.9.4 の org.scalaquery.meta パッケージには、MTable などの便利な SQL メタデータ ラッパー クラスが多数含まれています。

http://scalaquery.org/doc/api/scalaquery-0.9.4/#org.scalaquery.meta.MTable

ScalaQuery のテスト コードでは、これらのクラスが使用されている例を見ることができます。特に、org.scalaquery.test.MetaTest を参照してください。

テーブル名でキー付けされたすべての既知のテーブルのマップを提供するために、この小さな関数を作成しました。

import org.scalaquery.meta.{MTable}
def makeTableMap(dbsess: Session) : Map[String, MTable] = {
    val tableList = MTable.getTables.list()(dbsess);
    val tableMap = tableList.map{t => (t.name.name, t)}.toMap;
    tableMap;
}

これで、SQL テーブルを作成する前に、「if (!tableMap.contains(tableName))」を確認できます。

于 2011-08-29T03:31:19.673 に答える
7

このスレッドは少し古いですが、誰かがこれを役に立つと思うかもしれません。私のすべてのDAOにはこれが含まれています:

def create = db withSession {
    if (!MTable.getTables.list.exists(_.name.name == MyTable.tableName))
        MyTable.ddl.create
}
于 2013-04-07T11:39:48.070 に答える
2

PostGreSQL DB for PlayFramework を使用してアプリケーションの起動をチェックする完全なソリューションを次に示します。

import globals.DBGlobal
import models.UsersTable
import org.scalaquery.meta.MTable
import org.scalaquery.session.Session

import play.api.GlobalSettings
import play.api.Application

object Global extends GlobalSettings {

    override def onStart(app: Application)  {

        DBGlobal.db.withSession { session : Session =>
            import org.scalaquery.session.Database.threadLocalSession
            import org.scalaquery.ql.extended.PostgresDriver.Implicit._
            if (!makeTableMap(session).contains("tableName")) {
                UsersTable.ddl.create(session)
            }
        }
    }

    def makeTableMap(dbsess: Session): Map[String, MTable] = {
        val tableList = MTable.getTables.list()(dbsess)
        val tableMap = tableList.map {
        t => (t.name.name, t)
    }.toMap
        tableMap
    }
}
于 2012-05-30T13:28:11.220 に答える
1

java.sql.DatabaseMetaDataインターフェース)で。データベースに応じて、多かれ少なかれ機能が実装される場合があります。

于 2011-03-26T11:52:14.050 に答える
0

DAO impl で次のメソッドを定義できます ( Slick MTable.getTables から取得すると、Unexpected exception[JdbcSQLException: Invalid value 7 for parameter columnIndex [90008-60]] で常に失敗します)。あなたのデータベースのテーブル:

    def checkTable() : Boolean = {
        val action = MTable.getTables
        val future = db.run(action)
        val retVal = future map {result =>
          result map {x => x}
        }

        val x = Await.result(retVal, Duration.Inf)

        if (x.length > 0) {
          true
        } else {
          false
        }
      }

または、println メソッドを使用して、「GIVENTABLENAME」または何かが存在するかどうかを確認できます。

      def printTable() ={
          val q = db.run(MTable.getTables)
          println(Await.result(q, Duration.Inf).toList(0)) //prints first MTable element
          println(Await.result(q, Duration.Inf).toList(1))//prints second MTable element
          println(Await.result(q, Duration.Inf).toList.toString.contains("MTable(MQName(public.GIVENTABLENAME_pkey),INDEX,null,None,None,None)"))
      }

追加することを忘れないでください

    import slick.jdbc.meta._

次に、通常の @Inject() を使用して、どこからでもメソッドを呼び出します。play 2.4 と play-slick 1.0.0 を使用。

乾杯、

于 2015-09-29T16:20:52.007 に答える