2016-06-05 15 views
5

Tôi có một bảng JOURNAL nơi cột INSERT_DATE phải được điền bởi DB với ngày và giờ hiện tại khi bản ghi được chèn vào. Tôi không sử dụng loại TIMESTAMP vì mục đích giới hạn của nó.Làm thế nào để bỏ qua các giá trị cột khi thực hiện chèn khối lượng lớn 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) 
} 

Tôi cũng thực hiện một lớp hợp:

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

Khi ứng dụng của tôi bắt đầu lên, tôi cư DB với dữ liệu thử nghiệm ngẫu nhiên:

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))) 

này hoạt động, nhưng ist INSERT_DATE được thiết lập bởi JVM không phải bởi Cơ sở dữ liệu. Các tài liệu Slick nói rằng các cột nên được bỏ qua, nếu một người muốn giá trị mặc định được chèn vào. Nhưng tôi chỉ không nhận được làm thế nào tôi bỏ qua cột nếu tôi có một lớp trường hợp.

Tôi cũng tìm thấy điều này SO post nhưng không thể tìm ra cách sử dụng nó trong ngữ cảnh của tôi.

Bất kỳ ý tưởng nào?

Trả lời

2

Tài liệu Slick đưa ra ví dụ về quyền bỏ sót như vậy trong đoạn mã đầu tiên here. Thực hiện theo các bước hoặc the cvogt's answer và bạn sẽ đến giải pháp:

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

Không hoạt động với tôi: '[lỗi] Slick không biết cách ánh xạ các loại đã cho. [lỗi] Nguyên nhân có thể xảy ra: T trong Bảng [T] không khớp với phép chiếu * của bạn. Hoặc bạn sử dụng loại không được hỗ trợ trong Truy vấn (ví dụ: Danh sách scala). [lỗi] Mức độ bắt buộc: slick.lifted.FlatShapeLevel [lỗi] Loại nguồn: (slick.lifted.Rep [Int], slick.lifted.Rep [java.time.LocalDateTime], slick.lifted.Rep [Int] , slick.lifted.Rep [String]) [lỗi] Loại giải nén: T [lỗi] Loại đóng gói: G [lỗi] TableQuery [Journal] .map (je => (je.id, je.valueDate, je .amount, je.note)) ++ = ' – binford

1

Tôi làm việc theo cách sau:

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) 

Tôi không sử dụng lớp trường hợp ở đây, chỉ cần một tuple.

Các vấn đề liên quan