2016-06-05 19 views
5

INSERT_DATE sütununun, kayıt eklendiğinde geçerli tarih ve saat ile DB tarafından doldurulması gereken bir JOURNAL tablosum var. Sınırlı aralığı nedeniyle TIMESTAMP tipini amaç doğrultusunda kullanmamıştım.Toplu yerleştirme kayması yaparken sütun değerleri nasıl atılır 3.x?

class Journal(tag: Tag) extends Table[JournalEntry](tag, "JOURNAL") { 
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc) 
    def insertDate = column[OffsetDateTime]("INSERT_DATE", SqlType("DateTime default CURRENT_TIMESTAMP"))(localDateTimeColumnType) 
    def valueDate = column[OffsetDateTime]("VALUE_DATE", SqlType("DateTime"))(localDateTimeColumnType) 
    def amount = column[Int]("AMOUNT") 
    def note = column[String]("NOTE", O.Length(100)) 

    def * : ProvenShape[JournalEntry] = (id.?, insertDate.?, valueDate, amount, note) 
    <> ((JournalEntry.apply _).tupled, JournalEntry.unapply) 
} 

Ben de bir durum sınıf uygulamak: my app başladığında

case class JournalEntry(id: Option[Int], insertDate: Option[LocalDateTime], 
    valueDate: LocalDateTime, amount: Int, note: String) 

, ben rastgele test verileri ile DB doldurmak:

TableQuery[Journal] ++= Seq.fill(1000)(JournalEntry(None, Some(LocalDateTime.now()), 
    LocalDateTime.of(2006 + Random.nextInt(10), 1 + Random.nextInt(11), 
    1 + Random.nextInt(27),Random.nextInt(24), Random.nextInt(60)), Random.nextInt(), 
    TestDatabase.randomString(100))) 

Bu çalışır, ancak INSERT_DATE ist Veritabanı tarafından değil JVM tarafından ayarlanır. Slick dokümanları, eklenecek varsayılan değerin istenmesi durumunda sütunların atlanması gerektiğini söylüyor. Ama ben bir vaka sınıfım varsa sütunları nasıl attığımı anlamıyorum.

Bu SO post numaralı telefonu da buldum ancak içeriğimde nasıl kullanacağımı anlamadım.

Herhangi bir fikrin var mı?

cevap

2

Slick belgeleri, ilk kod parçacığı here'da bu tür bir ihmal hakkının örneğini verir. adımları veya the cvogt's answer izleyin ve çözümü varacaklardır:

TableQuery[Journal].map(je => (je.id, je.valueDate, je.amount, je.note)) ++= Seq.fill(1000)((None, LocalDateTime.of(2006 + Random.nextInt(10), 1 + Random.nextInt(11), 1 + Random.nextInt(27),Random.nextInt(24), Random.nextInt(60)), Random.nextInt(), TestDatabase.randomString(100)))

+0

Benim için çalışmıyor: '[error] Slick, verilen türlerin nasıl eşleneceğini bilmiyor. [error] Olası nedenler: Tablodaki [T] T, * projeksiyonunuzla eşleşmiyor. Veya bir sorguda desteklenmeyen bir tür (örneğin, scala listesi) kullanın. [error] Gerekli seviye: slick.lifted.FlatShapeLevel [error] Kaynak türü: (slick.lifted.Rep [Int], slick.lifted.Rep [java.time.LocalDateTime], slick.lifted.Rep [Int] , slick.lifted.Rep [String]) [error] Paketlenmemiş tip: T [error] Paket türü: G [error] TableQuery [Günlük] .map (je => (je.id, je.valueDate, je .amount, je.note)) ++ = ' – binford

1

ben şu şekilde işler: Ben burada sadece bir demet vaka sınıfını kullanmıyorum

import java.time.{ ZonedDateTime, ZoneOffset} 
import slick.profile.SqlProfile.ColumnOption.SqlType 
import scala.concurrent.duration.Duration 
import scala.concurrent.Await 

implicit val zonedDateTimeType = MappedColumnType.base[ZonedDateTime, Timestamp](
    {dt =>Timestamp.from(dt.toInstant)}, 
    {ts =>ZonedDateTime.ofInstant(ts.toInstant, ZoneOffset.UTC)} 
) 

class Users(tag: Tag) extends Table[(String, ZonedDateTime)](tag, "users") { 
    def name = column[String]("name") 
    def createAt = column[ZonedDateTime]("create_at", SqlType("timestamp not null default CURRENT_TIMESTAMP")) 
    def * = (name, createAt) 
} 

val users = TableQuery[Users] 
val setup = DBIO.seq(
    users.schema.create, 
    users.map(u => (u.name)) ++= Seq(("Amy"), ("Bob"), ("Chris"), ("Dave")) 
Await.result(db.run(setup), Duration.Inf) 

.

İlgili konular