我正在尝试
ScalaQuery,这真的很棒.我可以使用Scala类定义数据库表,并轻松查询.
但是我想知道,在下面的代码中,我如何检查一个表是否存在,所以我不会调用“Table.ddl.create”两次,当我运行这个程序两次得到一个异常?
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 } } } }
解决方法
ScalaQuery版本0.9.4在org.scalaquery.Meta包中包含许多有用的sql元数据包装器类,例如MTable:
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))”.