我目前正在阅读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进行投诉,但是使用一个上划线就可以了。
这种情况怎么会发生?