1

ドキュメントの例に示されているように、ScalaTest テスト ケースにテスト データベースを使用するのにかなりの時間を費やしています。

デフォルトのデータベースと testdb データベースがあり、仕様は次のようになります

class JobSpec extends FlatSpec with AutoRollback {
  DBsWithEnv("test").setup('testdb)
  override def db = NamedDB('testdb).toDB

  override def fixture(implicit session:DBSession) = {
    User.insert("test_user")
  }

  it should "create a new user" in { implicit session: DBSession =>
    User.sqlFind("test_user") //succeeds
    User.dslFind("test_user") //fails
  }
}

SQL を使用したクエリは機能するようですが、DSL を使用したクエリは機能しません。デフォルト データベースにアクセスしようとすると DSL クエリ エラーが発生しますが、SQL クエリでは testdb データベースが正しく使用されます。ここにエラーがあります

Connection pool is not yet initialized.(name:'default)
java.lang.IllegalStateException: Connection pool is not yet initialized.(name:'default)

ここにユーザークラスがあります

case class User(name: String)
object User extends SQLSyntaxSupport[User] {
  def apply(u: SyntaxProvider[User])(rs: WrappedResultSet) = apply(u.resultName)(rs)
  def apply(j: ResultName[User])(rs: WrappedResultSet) = new User(rs.get(u.name))

  override val tableName = "users"
  val u = User.syntax("u")

  def dslFind(name: String)(implicit session: DBSession) = 
    withSQL {
      select.from(User as u).where.eq(u.name, name)
    }.map(User(u)).single().apply()
  def sqlFind(name: String)(implicit session: DBSession) = 
    sql""" select (name) from users where name = $name;"""
      .map(rs => new User(rs.string(1)).single().apply()
}

DSL で作成されたクエリを呼び出すときに、testdb の代わりにデフォルトのデータベースを使用しようとする理由を知っている人はいますか? ありがとう!

4

1 に答える 1

4

次のように SQLSyntaxSupport をオーバーライドする必要があります。

override val connectionPoolName = 'testdb

その理由は、SQLSyntaxSupport が初回アクセス時に JDBC メタデータから列をフェッチするためです。

http://scalikejdbc.org/documentation/sql-interpolation.html

メタデータへの自動アクセスを避けたい場合は、列をオーバーライドするか、autoColumns マクロを使用します。

https://github.com/scalikejdbc/scalikejdbc/blob/2.2.8/scalikejdbc-syntax-support-macro/src/test/scala/foo/AutoSpec.scala#L20

于 2015-09-06T15:57:33.573 に答える