0

更新: Projection と ColumnBase に関するエラーは解決されましたが、オーバーロードされた挿入メソッドの問題がまだ発生しています。これを反映するようにコードが更新されました。


初めての適度に複雑な Scala プログラムを作成しようとしています。Twitter のタイムラインから値を読み取って、postgres テーブルに書き込みたいと思います。

Twitter 接続には twitter4j を使用し、データを postgres に書き込むには Slick を使用していますが、次の 2 つのコンパイル エラーが発生します。

エラー:

[error] /Users/trenthauck/Dropbox/Code/twitter-api/src/main/scala/org/trenthauck/TwitterApi.scala:45: overloaded method value insert with alternatives:
[error]   [TT](query: scala.slick.lifted.Query[TT,org.trenthauck.Timeline])(implicit session: scala.slick.session.Session)Int <and>
[error]   (value: org.trenthauck.Timeline)(implicit session: scala.slick.session.Session)Int
[error]  cannot be applied to (java.util.Date, Int, String)
[error]       Timeline.insert(date, id, text)
[error]                ^
[error] one error found
[error] (compile:compile) Compilation failed

ファイル内の私の洗練された定義DatabaseApi.scala:

package org.trenthauck

import slick._
import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

import java.sql.Date

case class Timeline (date: Date, id: Long, text: String)

object Timeline extends Table[Timeline]("timeline") {
  def date = column[Date]("date")
  def id = column[Long]("id")
  def text = column[String]("text")
  def * = date ~ id ~ text <> (Timeline.apply _, Timeline.unapply _)
}

ファイル内の私の Twitter の定義TwitterApi.scala:

package org.trenthauck

import twitter4j._

import slick._
import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

trait TwitterInstance {
  val consumerKey = ""
  val consumerSecret = ""
  val accessToken = ""
  val accessSecret = ""

  val cb = new conf.ConfigurationBuilder()

  cb.setOAuthConsumerKey(consumerKey)
    .setOAuthConsumerSecret(consumerSecret)
    .setOAuthAccessToken(accessToken)
    .setOAuthAccessTokenSecret(accessSecret)

  val twitter = new TwitterFactory(cb.build()).getInstance

}

class Twitter extends TwitterInstance {
  //get timeline
  def getUserTimeline() = twitter.getUserTimeline()

  //insert tweets
  def insertTweets() = {
    val tweets = this.getUserTimeline.iterator
    implicit val session = Database.forURL("jdbc:postgres//localhost/twitter",
                                            driver="org.postgresql.Driver",
                                            user="trenthauck")
    session withTransaction {

      Timeline.ddl.create

      while(tweets.hasNext) {
        var tweet = tweets.next
        Timeline.insert(tweet.getCreatedAt, tweet.getId, tweet.getText)
      }
    }
  }
}

Twitter への接続は正常に機能しているようです。問題を引き起こしているタイムライン テーブルにデータを挿入しています。

ありがとう

4

3 に答える 3

1

Timelineクラスのマッピングを定義する必要があります。これを試して..

def * = date ~ id ~ text <> (Timeline.apply _, Timeline.unapply _)
于 2013-10-19T17:12:57.550 に答える
0

マッパー オブジェクトを次から変更します。object Timeline

に:object Timelines

そして、するTimelines.insert(...)

組み込みのコンパニオン オブジェクトはcase class Timeline、Slick の機能を妨げます。

Slick docsのすべてのサンプル コードを見てください。コンパニオン オブジェクトは常に複数形化されているか、代わりに単純なクラス/インスタンス化を使用して完全に削除されています。

于 2013-10-20T10:52:36.957 に答える
0

投稿されたviditは、デフォルトのプロジェクションをタイムラインケースクラスにマッピングしていることを意味するため、挿入では生のタプルではなくケースクラスを使用する必要があります。

ただし、コード サンプルではケース クラスとテーブルが同じ名前になるように定義されているため、おそらくエラーが発生します。少なくともテーブルの名前を変更することをお勧めします。そうすれば、挿入は次のようになりますTimelineTable.insert(Timeline(tweet.getCreatedAt, tweet.getId, tweet.getText))

于 2013-10-20T06:55:08.707 に答える