更新: 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 への接続は正常に機能しているようです。問題を引き起こしているタイムライン テーブルにデータを挿入しています。
ありがとう