2012-01-28 88 views
1

我目前正在阅读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进行投诉,但是使用一个上划线就可以了。

这种情况怎么会发生?

回答

1

我想你的文件是用windows编码编码的。如果你有Windows编码,并且你的sql包含换行符,就有这种问题。

尝试使用UTF-8编码文件