Search code examples
scalascalaquery

How could I know if a database table is exists in ScalaQuery


I'm trying ScalaQuery, it is really amazing. I could defined the database table using Scala class, and query it easily.

But I would like to know, in the following code, how could I check if a table is exists, so I won't call 'Table.ddl.create' twice and get a exception when I run this program twice?

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
            }
        }
    }
}

Solution

  • ScalaQuery version 0.9.4 includes a number of helpful SQL metadata wrapper classes in the org.scalaquery.meta package, such as MTable:

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

    In the test code for ScalaQuery, we can see examples of these classes being used. In particular, see org.scalaquery.test.MetaTest.

    I wrote this little function to give me a map of all the known tables, keyed by table name.

    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;
    }
    

    So now, before I create an SQL table, I can check "if (!tableMap.contains(tableName))".