1

現在、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

アップデート:

この質問を読みました: Play scala の Magic での ColumnNotFound 問題

コメントに続いて、クエリを編集しました。SQL自体は変更されていませんが、すべてを1行に貼り付けました。

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 * )

それは奇跡です。今、コラムが見つかりました。クエリが 1 行よりも長い場合、テストは奇妙な ColumnNotFoundError で不平を言いますが、ワンライナーではすべて問題ありません。

このようなことがどうして起こるのでしょうか?

4

1 に答える 1

1

あなたのファイルはWindowsエンコーディングでエンコードされていると思います。Windowsエンコーディングを使用していて、SQLに改行が含まれている場合、この種の問題があります.

UTF-8 でエンコードされたファイルで試してください

于 2012-01-30T08:51:56.467 に答える