Как настроить Play! Фреймворк для работы с ScalaQuery и H2? - PullRequest
3 голосов
/ 02 января 2012

У меня уже есть какой-то простой проект с одним сценарием миграции:

# --- !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 ----------------------

Так что я более или менее знаю, что происходит (но я не знаю почему).Когда я создаю структуру БД с эволюцией, тогда имя таблицы и имена столбцов записываются заглавными буквами.
И так как я нахожусь на Linux, это имеет значение.Если бы я изменил имена таблиц и столбцов в коде также на верхний регистр, то все работает.

Мне только интересно, если это ошибка или есть ли какой-либо способ принудительного применения правильного регистра при переносе?

1 Ответ

5 голосов
/ 04 января 2012

Скорее всего, проблема в том, что Play!Framework ссылается на имена идентификаторов (имена таблиц, имена столбцов) в запросе, поэтому вам необходимо также указывать имя таблицы в операторе 'create table':

create table "user" (
  "name"        varchar(255) not null primary key,
  "password"    varchar(255) not null
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...