我有一个JOURNAL表,其中INSERT_DATE列应由DB填充,插入记录时的当前日期和时间。我没有故意使用TIMESTAMP类型,因为它的范围有限。
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)
}
我还实现了一个案例类:
case class JournalEntry(id: Option[Int], insertDate: Option[LocalDateTime],
valueDate: LocalDateTime, amount: Int, note: String)
当我的应用程序启动时,我使用随机测试数据填充数据库:
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)))
这样可行,但INSERT_DATE是由JVM设置的,而不是由数据库设置的。 Slick文档说如果想要插入默认值,则应省略列。但是如果我有一个案例类,我就不知道如何省略列。
我也发现了这个SO post,但无法弄清楚如何在我的上下文中使用它。
有什么想法吗?
答案 0 :(得分:2)
Slick文档在第一个代码段here中提供了此类省略的示例。按照步骤或the cvogt's answer,您将得到解决方案:
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)))
答案 1 :(得分:1)
我的工作方式如下:
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)
我这里没有使用case类,只是一个元组。