2012-01-28 7 views
1

私は現在、プレイのyabeチュートリアルのスケーラ版を読んでいます。 yabeはまだ別のブログエンジンの略で、チュートリアルデータのある時点では自然に保存する必要があります。最初のSQLの進化は次のとおりです。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; 

投稿とコメント用のテーブルが追加された後。スカラー側では、各データベースエントリをケースクラスにマッピングすることができます。その付随オブジェクトは、特性マジックを拡張し、様々なヘルパー機能を実装します。この問題は、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") 
} 

テストがエラーメッセージで失敗します。

/test/Tests.scalaでColumnNotFound(User.id)、41行目:ヴァル・ポスト= Post.allWithAuthor

どの列IDがそのように消えることができますか?私はSQLやスカラのコードで何も変更しませんでした。テストをスワップするだけで、エラーはオフに切り替わります。このスカラ/ SQLコード

val users= User.find("id={id}").on("id"->1).as(User*) 

はありませんしながら、どういうわけか、このSQLコード

  select * from Post p 
      join User u on p.author_id = u.id 
      order by p.postedAt desc 

は、IDを見つけることができません。

何が問題になったか説明できますか?私はこの質問を読んだ

: はここにチュートリアルhttp://scala.playframework.org/documentation/scala-0.9.1/guide1

UPDATEへのリンクです ColumnNotFound problem with Magic in play scala

とコメント次のクエリを編集しました。 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が発生しますが、1つのonelinerがあれば問題ありません。

どうすればこのようなことができますか?

答えて

1

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

UTF-8でエンコードされたファイルで試す

関連する問題