Chr*_*ach 5 scala foreign-keys auto-increment slick
我是Slick的新手,并努力为以下内容找到一个好的规范示例.
我想在两个表中插入一行.第一个表有一个自动递增的主键.第二个表通过其主键与第一个表相关.
所以我想:
请欣赏以上逻辑的规范示例,以及下面我的定义的任何相关建议(我对Slick来说很新!).谢谢!
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)
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)
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.
你所要做的就是
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表看起来很好.