【问题标题】:How to configure Play! Framework to work with ScalaQuery and H2?如何配置播放!使用 ScalaQuery 和 H2 的框架?
【发布时间】:2012-01-31 14:04:19
【问题描述】:

我已经有了一个带有一个迁移脚本的简单项目:

# --- !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上,所以这很重要。 如果我将代码中的表名和列名更改为大写,那么一切正常。

我只是好奇这是一个错误,还是有什么方法可以对迁移执行适当的案例?

【问题讨论】:

  • 您将迁移脚本放在哪里?我想这是一个进化脚本,不是吗?
  • 是的。文件路径为 db/evolutions/default/1.sql
  • 命名表用户也不是一个好主意。太多的 dbs sql 实现变得混乱。

标签: scala playframework h2 playframework-2.0 scalaquery


【解决方案1】:

最有可能的是,问题在于 Play!框架在查询中引用了标识符名(表名、列名),所以在'create table'语句中也需要引用表名:

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

【讨论】:

  • 编辑:我在 Scalaquery 组上发布了这个,但没有回复。最简单的解决方案是将标识符更改为大写(列名和表名)。这似乎有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多