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

Chr*_*ach 5 scala foreign-keys auto-increment slick

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

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

所以我想:

  1. 开始交易
  2. 在表1中插入一行,生成一个键
  3. 在表2中插入一行,并在上一步中生成外键
  4. 结束事务(如果失败则回滚步骤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)
Run Code Online (Sandbox Code Playgroud)

(类似于表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)
}
Run Code Online (Sandbox Code Playgroud)

表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
  )
Run Code Online (Sandbox Code Playgroud)

我正在使用MySQL数据库和Slick 3.1.0.

pam*_*amu 5

你所要做的就是

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

db.run(tx)
Run Code Online (Sandbox Code Playgroud)

请注意,这insertUserNameChange是将UserNameChange实例插入数据库的功能.它需要您从之前的插入操作中获得的EntryId.

使用flatMap和编写动作来transactionally在事务中运行整个查询.

你的Slick表看起来很好.