sql列“消失” - 播放框架

时间:2012-01-28 14:30:21

标签: sql database scala playframework anorm

我正在阅读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; 

添加了帖子和评论的表格。在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一切都很好。

这样的事情怎么会发生?

1 个答案:

答案 0 :(得分:1)

我猜你的文件是用windows编码编码的。如果您有Windows编码并且您的sql包含换行符,则会出现此类问题。

尝试使用UTF-8编码文件