2015-01-28 3 views
2

Я использую H2 в базе данных памяти с помощью платформы воспроизведения. Я начинаю, поэтому я решил сделать небольшое приложение для входа в систему, чтобы начать работу с scala и воспроизведением. Я решил использовать H2 в базе данных памяти, но он выбрасывает исключение Table not found я пишу скрипт в файл SQL и игры попросил меня, чтобы применить этот сценарий, когда я запустить приложение, но он бросает исключение, когда я пытаюсь вставить данные в нем исключение составляетH2 in-memory database, [JdbcSQLException: таблица «USERINFO» не найдена; 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; 

и вот раздел приложения.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, но ничего не изменилось, пожалуйста, помогите мне, где я делаю неправильно

+0

в оперативной памяти базы данных в оперативной памяти, так что он уходит, когда ты закрыть доступ к ней, а разные приложения получить свою версию. Как вы выполняете SQL? Если вы запускаете его в отдельном процессе, это именно то, что мы ожидаем; попробуйте дать ему путь к файловой системе ('jdbc: h2:/home/users/username/mydatabase') вместо – lmm

+0

Я получаю помощь от [этой ссылки] (https://www.playframework.com/documentation/2.1.0/ ScalaTodoList) – swaheed

+0

Тогда да, база данных в памяти не будет работать именно по этой причине. – lmm

ответ

1

1.

Скорее всего, проблема в том, что Play! Framework приводит имена идентификаторов (имена таблиц, имена столбцов) в запросе, так что вам нужно экранирует имя таблицы в операторе «создать таблицу», а также:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^