2012-01-02 51 views
3

我已經有一個遷移腳本一些簡單的項目:如何配置Play!使用ScalaQuery和H2的框架?

# --- !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; 

數據庫我使用的是H2在內存:

db.default.driver=org.h2.Driver 
db.default.url=jdbc:h2:mem:play 

然後我明明想查詢一些數據。當我使用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 ?) 
    } 
    } 
} 

倒黴,當我試圖做同樣的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 
    } 
} 

我總是得到同樣的錯誤:

[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]] 



有什麼我做錯了嗎? 我想我嚴格遵循指導從那裏:https://github.com/playframework/Play20/wiki/ScalaDatabase

---------------------編輯------------- ----------

看起來這是Play的演變和ScalaQuery之間的某種不兼容。 當我創建表使用:

database withSession { 
    implicit db: Session => 
    User.ddl.create 
    User.insert("demo", "demo") 
} 

一切似乎工作正常。 也許以後我會創建一些簡單的MySQL數據庫,並檢查裏面發生了什麼。

---------------------編輯2 -----------------------

所以我或多或少知道發生了什麼(但我不知道爲什麼)。 當我使用evolutions創建db結構時,所有大寫字母都會寫下表名和列名。
因爲我在Linux上,所以它很重要。 如果我將代碼中的表和列名更改爲大寫,那麼一切正常。

我只是好奇,如果它是一個錯誤,或者如果它是任何方式執行適當的情況下遷移?

+0

你在哪裏把你的遷移腳本?我想這是一個進化腳本,不是嗎? – mandubian 2012-01-03 07:27:04

+0

是的。文件路徑是db/evolutions/default/1.sql – 2012-01-03 10:38:04

+0

對於命名一個表User也不是一個好主意。太多的dbs sql實現會讓人困惑。 – flurdy 2012-04-20 00:43:54

回答

5

最有可能的問題是Play!框架引用在查詢中的標識符名稱(表名,列名),這樣就需要在「創建表」語句引用表名以及:

create table "user" (
    "name"  varchar(255) not null primary key, 
    "password" varchar(255) not null 
); 
+0

你完全正確:) – 2012-01-04 20:23:45

+1

+1終於解決了我的問題。 – 2012-04-06 04:29:24

+1

編輯:我張貼在Scalaquery組,但沒有回覆。最簡單的解決方案是將標識符更改爲大寫(列名和表名)。這似乎工作 – 2012-04-06 09:05:45