【发布时间】:2015-03-27 10:27:33
【问题描述】:
我在内存数据库中使用 H2 和 play framework 我是一个初学者,所以我决定制作一个小的 Login-Register 应用程序来开始使用 scala 和 play 我决定在内存数据库中使用 H2 但它会抛出 Table not foundexception我在一个 sql 文件中编写了一个脚本,并在我启动应用程序时要求我应用这个脚本,但是当我尝试在其中插入数据时它抛出异常,异常是
[JdbcSQLException: Table "USERINFO" not found; SQL statement:
insert into USERINFO (fname,lname,email,userName,pwd,age,choice,gender) values (?,?,?,?,?,?,?,?) [42102-175]]
这里是sql文件的脚本
# --- !Ups
CREATE TABLE USERINFO(
fname varchar(255) NOT NULL,
lname varchar(255) NOT NULL,
email varchar(255) NOT NULL,
userName varchar(255) NOT NULL,
pwd varchar(255) NOT NULL,
age Int NOT NULL,
choice varchar(255) NOT NULL,
gender varchar(255) NOT NULL
);
DROP TABLE USERINFO;
这是application.conf的一部分
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user=sa
db.default.password=""
db_close_delay=-1
这里是application.scala的代码
package controllers
import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import views.html.defaultpages.badRequest
import play.api.data.validation.Constraints._
import models.User
object Application extends Controller {
val RegisterForm = Form(
mapping(
"fname" -> nonEmptyText(1, 20),
"lname" -> nonEmptyText(1, 20),
"email" -> email,
"userName" -> nonEmptyText(1, 20),
"password" -> nonEmptyText(1, 20),
"age" -> number,
"choice" -> text,
"gender" -> text
)
(User.apply)(User.unapply)
verifying("Ag should be greater then or eual to 18",model=> model.age match
{
case (age) => age>=18
})
)
def index = Action {
Ok(views.html.index(RegisterForm))
}
def register =Action {implicit request =>
RegisterForm.bindFromRequest().fold(
hasErrors => BadRequest(views.html.index(hasErrors))
,
success => {
val result = User.save(success)
println(s"INSERT succeeded, id = $result")
Redirect(routes.Application.index)
}
)
}
}
这是 User.scala 的代码
package models
import anorm._
import play.api.db.DB
import anorm.SqlParser._
import play.api.Play.current
case class User (
fname:String,
lname:String,
email:String,
userName:String,
password:String,
age:Int,
choice:String,
gender:String
)
object User{
val userinfo = {
get[String]("fname") ~
get[String]("lname") ~
get[String]("email") ~
get[String]("userName") ~
get[String]("pwd") ~
get[Int]("age") ~
get[String]("choice") ~
get[String]("gender") map {
case fname ~ lname ~email~ userName ~ password ~age~ choice~gender =>
User(fname , lname ,email, userName , password ,age, choice,gender)
}
}
def save(ud:User):Option[Long]= {
val id :Option[Long] = DB.withConnection {implicit c =>
SQL ("insert into USERINFO (fname,lname,email,userName,pwd,age,choice,gender) values ({fname},{lname},{email},{userName},{password},{age},{choice},{gender})")
.on('fname -> ud.fname, 'lname ->ud.lname ,'email ->ud.email, 'userName->ud.userName , 'password->ud.password ,'age->ud.age, 'choice->ud.choice,'gender->ud.gender)
.executeInsert()
}
id
}
/* def save(ud:User)= {
DB.withConnection {implicit c =>
SQL ("insert into USERINFO (fname,lname,email,userName,pwd,age,choice,gender) values ({fname},{lname},{email},{userName},{password},{age},{choice},{gender})")
.on('fname -> ud.fname, 'lname ->ud.lname ,'email ->ud.email, 'userName->ud.userName , 'password->ud.password ,'age->ud.age, 'choice->ud.choice,'gender->ud.gender)
.executeUpdate()
}
}
*/
}
我用这个executeUpdate 和executeInsert 都试过了,但没有任何改变,请帮助我哪里做错了
【问题讨论】:
-
内存数据库是内存中的,所以当你关闭正在访问它的东西时它就会消失,并且不同的应用程序会获得自己的版本。你是如何执行 SQL 的?如果您在单独的进程中运行它,这正是我们所期望的;尝试给它一个文件系统路径(
jdbc:h2:/home/users/username/mydatabase) -
我正在接受this link的帮助
-
那么是的,内存数据库正是因为这个原因而无法工作。
-
"我们将在本教程中使用 Anorm 来查询数据库。首先我们需要定义数据库模式。让我们为此使用 Play evolutions,因此在 "conf/evolutions/default 中创建第一个进化脚本/1.sql
-
什么原因对不起我不明白你能解释一下吗
标签: database scala h2 playframework-2.3 scala-2.11