現在、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 で不平を言いますが、ワンライナーではすべて問題ありません。
このようなことがどうして起こるのでしょうか?