3

私はすでに1つの移行スクリプトを持ついくつかの簡単なプロジェクトを持っています:

# --- !Ups

create table user (
  name        varchar(255) not null primary key,
  password    varchar(255) not null
);

insert into user values ('demo', 'demo');
insert into user values ('kuki', 'pass');


# --- !Downs

drop table if exists user;

私が使用しているデータベースはメモリ内のH2です:

db.default.driver=org.h2.Driver
db.default.url=jdbc:h2:mem:play

次に、明らかにいくつかのデータをクエリしたいと思います。anormを使用しているときは、すべてが正しく機能しています。

case class User(name: String, password: String)
object User {

  val simple = {
    get[String]("user.name") ~/
    get[String]("user.password") ^^ {
      case name~password => User(name, password)
    }
  }

  def findByName(name: String): Option[User] = {
    DB.withConnection { implicit connection =>
     SQL("select * from user where name = {name}").on(
        'name -> name
      ).as(User.simple ?)
    }
  }
}

ScalaQueryで同じことをしようとすると、不運になります。

object User extends Table[(String, String)]("user") {

  lazy val database = Database.forDataSource(DB.getDataSource())

  def name = column[String]("name", O PrimaryKey, O NotNull)
  def password = column[String]("password", O NotNull)
  def * = name ~ password

  def findByName(name: String) = database withSession {
    implicit db: Session =>
      (for (u <- this if u.name === name) yield u.name ~ u.password).list
  }
}

私はいつも同じエラーを受け取ります:

[JdbcSQLException: Tablela "user" nie istnieje Table "user" not found; 
SQL statement: SELECT "t1"."name","t1"."password" FROM "user" "t1" WHERE ("t1"."name"='input_name') [42102-158]]



私が間違っていることはありますか?私はそこからのガイドに厳密に従っていると思います:https

://github.com/playframework/Play20/wiki/ScalaDatabase--------------------- 編集---- -----------------------------------

Playの進化とScalaQueryの間のある種の非互換性のようです。以下を使用してテーブルを作成したとき:

database withSession {
  implicit db: Session =>
    User.ddl.create
    User.insert("demo", "demo")
}

すべてが正常に機能しているようです。後で、簡単なMySQLデータベースを作成して、内部で実際に何が起こっているかを確認します。

---------------------編集2------------------------

だから私は多かれ少なかれ何が起こっているのか知っています(しかし私は理由がわかりません)。進化を伴うdb構造を作成しているとき、テーブル名と列名はすべて大文字で書き留められます。
そして、私はLinuxを使用しているので、それは重要です。コード内のテーブルと列の名前も大文字に変更すると、すべてが機能します。

それがバグなのか、それとも移行に適切なケースを適用する方法なのか、私は興味がありますか?

4

1 に答える 1

5

おそらく、問題はPlay!Frameworkはクエリで識別子名(テーブル名、列名)を引用するため、「createtable」ステートメントでもテーブル名を引用する必要があります。

create table "user" (
  "name"        varchar(255) not null primary key,
  "password"    varchar(255) not null
);
于 2012-01-04T06:20:00.110 に答える