Pio*_*lka 3 scala h2 playframework scalaquery playframework-2.0
我已经有一个带有一个迁移脚本的简单项目:
# --- !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;
Run Code Online (Sandbox Code Playgroud)
我正在使用的数据库是内存中的H2:
db.default.driver=org.h2.Driver
db.default.url=jdbc:h2:mem:play
Run Code Online (Sandbox Code Playgroud)
然后我显然想查询一些数据.当我使用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 ?)
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用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
}
}
Run Code Online (Sandbox Code Playgroud)
我总是得到同样的错误:
[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]]
Run Code Online (Sandbox Code Playgroud)
有什么我做错了吗?我想我从那里严格遵循指南:https
://github.com/playframework/Play20/wiki/ScalaDatabase
---------------------编辑---- -------------------
看起来这是Play的演变和ScalaQuery之间的某种不兼容性.当我创建表时使用:
database withSession {
implicit db: Session =>
User.ddl.create
User.insert("demo", "demo")
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好.也许以后我会创建一些简单的MySQL数据库并检查内部真正发生的事情.
---------------------编辑2 -----------------------
所以我或多或少地知道发生了什么(但我不知道为什么).当我使用evolutions创建db结构时,表名和列名将以全部大写字母写下来.
因为我在Linux上,所以它很重要.如果我将代码中的表和列名称更改为大写,那么一切正常.
我只是好奇它是否是一个错误,或者是否有任何方法来强制执行适当的迁移案例?
最有可能的问题是Play!框架引用了查询中的标识符名称(表名,列名),因此您还需要在"create table"语句中引用表名:
create table "user" (
"name" varchar(255) not null primary key,
"password" varchar(255) not null
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |