【发布时间】:2012-01-28 14:30:21
【问题描述】:
我目前正在阅读 play 的 yabe 教程的 scala 版本。 yabe 代表另一个博客引擎,自然在教程中的某个时间点需要存储数据。第一个sql进化是这样的:
# 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;
之后添加了帖子和 cmets 的表格。在 Scala 方面,每个数据库条目都可以映射到一个案例类。它的伴生对象扩展了特性 Magic 并实现了各种辅助函数。问题是由 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), "bob@gmail.com", "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), "bob@gmail.com", "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 posts = Post.allWithAuthor
列 id 怎么会这样消失?我没有更改 sql 或 scala 代码中的任何内容。只需交换测试即可将错误“切换”到关闭状态。不知何故这个sql代码
select * from Post p
join User u on p.author_id = u.id
order by p.postedAt desc
在这个 scala/sql 代码中找不到 id
val users= User.find("id={id}").on("id"->1).as(User*)
会。
你能解释一下出了什么问题吗? 这是教程的链接http://scala.playframework.org/documentation/scala-0.9.1/guide1
更新:
我读过这个问题: 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 但使用 oneliner 一切都很好。
这样的事情怎么会发生?
【问题讨论】:
标签: sql database scala playframework anorm