【问题标题】:H2 in-memory database,[JdbcSQLException: Table "USERINFO" not found; SQL statement:H2内存数据库,[JdbcSQLException:找不到表“USERINFO”; SQL 语句:
【发布时间】: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()  
    }

  }
 */ 
  }

我用这个executeUpdateexecuteInsert 都试过了,但没有任何改变,请帮助我哪里做错了

【问题讨论】:

  • 内存数据库是内存中的,所以当你关闭正在访问它的东西时它就会消失,并且不同的应用程序会获得自己的版本。你是如何执行 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


【解决方案1】:

1.

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

    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

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2016-06-08
    • 2016-08-07
    • 2022-11-21
    • 2016-02-04
    • 2017-06-16
    • 1970-01-01
    • 2022-11-18
    • 2021-07-22
    相关资源
    最近更新 更多