我使用H2在内存数据库中使用play框架,我是个初学者,所以我决定制作一个小小的登录注册应用程序来开始使用scala并播放,我决定在内存数据库中使用H2,但是它会抛出Table not found
异常,我在一个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
,但是没有什么改变,请帮助我做错了什么。
发布于 2016-12-09 17:09:00
1.
最有可能的是,问题是这出戏!框架引用查询中的标识符名(表名、列名),因此您还需要在“create”语句中引用表名:
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
);
2.
如果没有帮助的话。还有一件事。我阅读了迁移文档,其中一个必须将libraryDependencies += evolutions
应用于build.sbt。
这些不是必要的,它们将自动应用演化(而不显示数据库的“默认”需求演变!):
applyEvolutions.db=true
applyEvolutions.default=true
applyDownEvolutions.default=true
https://stackoverflow.com/questions/28193656
复制相似问题