gpt4 book ai didi

scala - Slick - 将一行插入到与自动递增键链接的两个表中?

转载 作者:行者123 更新时间:2023-12-04 18:59:09 24 4
gpt4 key购买 nike

我是 Slick 的新手,正在努力为以下内容找到一个好的规范示例。

我想在两个表中插入一行。第一个表有一个自动递增的主键。第二个表通过其主键与第一个表相关。

所以我想:

  • 开始交易
  • 在表 1 中插入一行,生成一个键
  • 在表 2 中插入一行,使用上一步生成的外键
  • 结束事务(如果失败则回滚步骤 2 和 3)

  • 非常感谢上述逻辑的规范示例,以及关于我下面定义的任何相关建议(我对 Slick 非常陌生!)。谢谢!

    表 1 的插入逻辑

    private def insertAndReturn(entry: Entry) = 
    entries returning entries.map(_.id)
    into ((_, newId) => entry.copy(id = newId))

    def insert(entry: Entry): Future[Entry] =
    db.run(insertAndReturn(entry) += entry)

    (类似于表2)

    表格1
    class EntryTable(tag: Tag) extends Table[Entry](tag, "tblEntry") {
    def id = column[EntryId]("entryID", O.PrimaryKey, O.AutoInc)
    ...

    def * = (id, ...).shaped <> (Entry.tupled, Entry.unapply)
    }

    表 2
    class UsernameChangeTable(tag: Tag) extends Table[UserNameChange](tag, "tblUserNameChange") {
    def entryId = column[EntryId]("entryID")
    ...

    def entry = foreignKey("ENTRY_FK", entryId, entryDao.entries)(
    _.id, onUpdate = Restrict, onDelete = Cascade
    )

    我使用的是 MySQL 数据库和 Slick 3.1.0。

    最佳答案

    你所要做的就是

    val tx = 
    insertAndReturn(entry).flatMap { id =>
    insertUserNameChange(UserNameChange(id, ...))
    }.transactionally

    db.run(tx)

    请注意 insertUserNameChange是插入 UserNameChange 的函数实例存入数据库。它需要您从之前的插入操作中获得的 EntryId。

    使用 flatMap 组合 Action 并使用 transactionally在事务中运行整个查询。

    您的 Slick 表看起来不错。

    关于scala - Slick - 将一行插入到与自动递增键链接的两个表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318671/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com