Slick 2.0使用默认值插入并返回ID

时间:2014-05-06 15:49:31

标签: scala slick

我有这张桌子:

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

在字段上指定默认值

1 个答案:

答案 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