加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在Slick中定义可选外键?

发布时间:2020-12-16 19:21:28 所属栏目:安全 来源:网络整理
导读:我有这样一张桌子: object Addresses extends Table[AddressRow]("address") { def id = column[Int]("id",O.PrimaryKey,O.AutoInc) def street = column[String]("street") def number = column[String]("number") def zipcode = column[String]("zipcode"
我有这样一张桌子:

object Addresses extends Table[AddressRow]("address") {
   def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
  def street = column[String]("street")
  def number = column[String]("number")
  def zipcode = column[String]("zipcode")
  def city = column[String]("city")
  def country = column[String]("country")
  def geoLocationId = column[Int]("geo_location_id",O.Nullable)

 // Foreign keys.
 def geoLocation = foreignKey("fk_geo_location",geoLocationId,GeoLocations)(_.id)

 // Rest of my code.
 ...
}

我的案例类是:

case class AddressRow(
  id: Option[Int] = None,street: String,number: String,zipcode: String,city: String,country: String,geoLocationId: Option[Int])

你注意到geoLocation是一个可选的外键….

我找不到任何方法来在我的外键定义中描述这个“可选”.

我尝试过:

def geoLocation = foreignKey("fk_geo_location",geoLocationId.asColumnOf[Option[Int]],GeoLocations)(_.id)

但我收到:

Caused by: scala.slick.SlickException: Cannot use column Apply
Function Cast in foreign key constraint (only named columns are
allowed)

有人有建议吗?

解决方法

我不认为您尝试做的事情是通过使用外键可以实现的.
从Slick文档中查看 joining和 user defined types.

请注意leftJoin的示例:

val explicitLeftOuterJoin = for {
  (c,s) <- Coffees leftJoin Suppliers on (_.supID === _.id)
} yield (c.name,s.name.?)

因此,如果您想查询所有地址,则需要从类似的地方开始

val addressGeolocQuery = for {
  (addr,loc) <- Addresses leftJoin GeoLocations on (_.geoLocationId === _.id)
} yield addr.id ~ loc.prop1.? ~ loc.prop2.? /*and so on*/

然后,您可以映射该查询的结果,以便返回实际的Address实例,并使用Option [GeoLocation]完成.这就是为什么我将文档中的“用户定义类型”链接起来……这对我来说是一个新功能(我熟悉ScalaQuery,这是Slick之前的版本),但它看起来相当有前途.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读