如何使用 Doobie 插入链接对象
How to insert a linked object using Doobie
我需要向数据库中插入一个实体类型的对象
case class Entity(id: Long, name: String)
case class OtherEntity(id: Long, entity_id: Long, info: String)
case class AnotherEntity(other_entity_id: Long, data: String)
如果我在某处收到关于
的输入,我该怎么做
{
"name": "string",
"data": [
{
"info": "string",
"data": [
{
"data": "string"
}
]
}
]
}
主要问题是我想不出 doobie.ConnectioIO 的类似 foreach。
sql"insert into entity (name) values('name')"
.update.withUniqueGeneratedKeys[Long]("id")
.flatmap(entityId =>
sql"insert into other_entity (entity_id, info) values ($entityId, 'info')"
.update.withUniqueGeneratedKeys[Long]("id")
).flatmap(otherEntityId =>
sql"insert into another_entity (other_entity_id, data) values ($otherEntityId, 'data')"
.update.run
)
但这只适用于一对一关系。
谢谢你的帮助。
您可以将同一个外键的多个插入链接在一起。 IE。如果每个“名称”都有 List
个“信息”,则可以遍历该列表以返回 ConnectionIO[List[_]]
。或者,如果您使用 traverse_
.
,则只需一个 ConnectionIO[Unit]
import doobie.implicits._
import cats.implicits._
sql"insert into entity (name) values('name')"
.update.withUniqueGeneratedKeys[Long]("id")
.flatMap{ entityId =>
val infos: List[String] = ???
infos.traverse_{ info =>
sql"insert into other_entity (entity_id, info) values ($entityId, $info)"
.update.withUniqueGeneratedKeys[Long]("id")
.flatMap{ otherEntityId =>
val datas: List[String] = ???
datas.traverse_{ data =>
sql"insert into another_entity (other_entity_id, data) values ($otherEntityId, $data)"
.update.run
}
}
}
}
我需要向数据库中插入一个实体类型的对象
case class Entity(id: Long, name: String)
case class OtherEntity(id: Long, entity_id: Long, info: String)
case class AnotherEntity(other_entity_id: Long, data: String)
如果我在某处收到关于
的输入,我该怎么做{
"name": "string",
"data": [
{
"info": "string",
"data": [
{
"data": "string"
}
]
}
]
}
主要问题是我想不出 doobie.ConnectioIO 的类似 foreach。
sql"insert into entity (name) values('name')"
.update.withUniqueGeneratedKeys[Long]("id")
.flatmap(entityId =>
sql"insert into other_entity (entity_id, info) values ($entityId, 'info')"
.update.withUniqueGeneratedKeys[Long]("id")
).flatmap(otherEntityId =>
sql"insert into another_entity (other_entity_id, data) values ($otherEntityId, 'data')"
.update.run
)
但这只适用于一对一关系。 谢谢你的帮助。
您可以将同一个外键的多个插入链接在一起。 IE。如果每个“名称”都有 List
个“信息”,则可以遍历该列表以返回 ConnectionIO[List[_]]
。或者,如果您使用 traverse_
.
ConnectionIO[Unit]
import doobie.implicits._
import cats.implicits._
sql"insert into entity (name) values('name')"
.update.withUniqueGeneratedKeys[Long]("id")
.flatMap{ entityId =>
val infos: List[String] = ???
infos.traverse_{ info =>
sql"insert into other_entity (entity_id, info) values ($entityId, $info)"
.update.withUniqueGeneratedKeys[Long]("id")
.flatMap{ otherEntityId =>
val datas: List[String] = ???
datas.traverse_{ data =>
sql"insert into another_entity (other_entity_id, data) values ($otherEntityId, $data)"
.update.run
}
}
}
}