我有这张桌子:
case class CityRow(id: Long = 0, name: Option[String])
class City(tag: Tag) extends RichTable[CityRow](tag, "city") {
def * = (id, name) <>(CityRow.tupled, CityRow.unapply)
def ? = (id.?, name).shaped.<>({
r => import r._; _1.map(_ => CityRow.tupled((_1.get, _2)))
}, (_: Any) => throw new Exception("Inserting into ? projection not supported."))
override val id: Column[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
val name: Column[Option[String]] = column[Option[String]]("name", O.Default("no_name")
}
我想要实现的是使用name的默认值插入一行并返回id,查看slick documentation我看到了这个:
val userId = (users returning users.map(_.id)) += User(None, "Stefan", "Zeiger")
和此:
coffees.map(c => (c.name, c.supID, c.price)) += ("Colombian_Decaf", 101, 8.99)
他们确实单独工作,我想要的只是两者的混合,我试过这个:
(tableReference returning tableReference.map(_.id)) += (CityRow(name = None))
但抛出一个异常,说该名称不能为null:
PSQLException: : ERROR: null value in column "name" violates not-null constraint
Detail: Failing row contains (64, null). (QueryExecutorImpl.java:2103)
我做的是让它发挥作用:
case class CityRow(id: Long = 0, name: Option[String] = "no_name")
我不明白这是否是指定默认值的正确方法,如果是这样,如果我将来使用这样的函数会怎么样:
coffees.map(c => (c.name, c.supID, c.price)) += ("Colombian_Decaf", 101, 8.99)
我是否必须使用O.Default
?
答案 0 :(得分:4)
O.Default仅用于DDL生成。在构造实例时使用case类中的默认值。如果您使用DDL生成并希望它在您的实例中,则需要在两个位置指定它。
val name: Column[Option[String]]
错了。它应该是val name: Column[String]
,因为postgres告诉你名字不可为空:ERROR: null value in column "name" violates not-null constraint
。