我目前正在閱讀play的yabe教程的scala版本。 yabe代表了另一個博客引擎,當然在教程中某些時候需要存儲數據。第一個sql演變是這樣的:sql column「消失」 - 玩框架
# Users schema
# ---!Ups
CREATE TABLE User(
id bigint(20) NOT NULL AUTO_INCREMENT,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
fullname varchar(255) NOT NULL,
isAdmin boolean NOT NULL,
PRIMARY KEY (id)
);
# --- !Downs
DROP TABLE User;
之後,添加了帖子和評論的表。在scala一側,每個數據庫條目都可以映射到一個案例類。它的伴侶對象擴展了魔術特質並實現了各種輔助功能。該問題是由來自Post類的伴隨對象的此代碼引起的。你只需要看看SQL查詢:
def allWithAuthor:List[(Post,User)] =
SQL(
"""
select * from Post p
join User u on p.author_id = u.id
order by p.postedAt desc
"""
).as(Post ~< User ^^ flatten *)
我承認,雖然我理解的代碼做什麼,我決不會想出這個我自己。
爲了測試代碼如下測試運行:
it should "create a Post" in {
User.create(User(Id(1), "[email protected]", "secret", "Bob", false))
val users= User.find("id={id}").on("id"->1).as(User*)
}
這個測試完成就好了。 Scala的語法增加了一些複雜性,但可以清楚地看到,對於具有ID的用戶測試查詢等於1 該測試中的問題顯示出來:
it should "retrieve Posts with author" in {
User.create(User(Id(1), "[email protected]", "secret", "Bob", false))
Post.create(Post(NotAssigned, "My 1st post", "Hello world", new Date, 1))
val posts = Post.allWithAuthor
posts.length should be (1)
val (post,author) = posts.head
post.title should be ("My 1st post")
author.fullname should be ("Bob")
}
測試失敗,出現錯誤消息:
ColumnNotFound(User.id)在/test/Tests.scala 41行:VAL帖= Post.allWithAuthor
如何色譜柱內徑消失那樣?我沒有更改sql或scala代碼中的任何內容。只需交換測試,就可以「關閉」錯誤。不知怎的,這SQL代碼
select * from Post p
join User u on p.author_id = u.id
order by p.postedAt desc
沒有找到ID,而這斯卡拉/ SQL代碼
val users= User.find("id={id}").on("id"->1).as(User*)
一樣。
你能解釋一下哪裏出了問題? 這裏的鏈接教程http://scala.playframework.org/documentation/scala-0.9.1/guide1
UPDATE:
我讀過這樣一個問題: ColumnNotFound problem with Magic in play scala
和註釋下面編輯查詢。在SQL本身並沒有改變,但我已經貼這一切在一個單行:
def allWithAuthor:List[(Post,User)] =
SQL(
"""select * from Post p join User u on p.author_id = u.id order by p.postedAt desc"""
).as(Post ~< User ^^ flatten *)
這是一個奇蹟:現在找到列。如果查詢長於一行,則測試用奇怪的ColumnNotFoundError進行投訴,但是使用一個上劃線就可以了。
這種情況怎麼會發生?