4

Slick 1.x では、自動生成された主キーを使用してテーブルに挿入するのは少し複雑でした。挿入目的で pk を省略したテーブル プロジェクションを手動で作成する必要がありました。Slick 2.x がこの問題を解決するようです:

ソフト挿入がデフォルトになりました。つまり、+=、++=、insert、および insertAll を使用して挿入すると、AutoInc 列は自動的にスキップされます。これは、挿入のために個別のプロジェクション (主キーなし) が不要になったことを意味します。

ただし、2.x のドキュメントは更新しないでください。

一部のデータベース システムでは AutoInc 列に適切な値を挿入したり、None を挿入して作成された値を取得したりできますが、ほとんどのデータベースではこの動作が禁止されているため、これらの列を必ず省略する必要があります。Slick には、これを自動的に行う機能はまだありませんが、将来のリリースで計画されています。今のところ、AutoInc 列を含まないカスタム プロジェクションでクエリを使用する必要があります。

AutoInc を使用してテーブルに挿入し、生成されたキーを取得するための新しい 2.0 構文を知っている人はいますか?

4

2 に答える 2

2

挿入の構文は 1.0 と同じですが、autoinc 列が自動的に無視されるようになっただけです。そのため、何を行うかについてセマンティックな変更が.insertあります。古い動作 (それらが含まれている場所) が必要な場合は、 を呼び出す必要があります.forceInsert

于 2013-11-22T15:25:38.697 に答える
1
  You can retrieve the generated value like this:

  case class Employee( empName: String,empType: String, empId: Int = 0)
        class Employees(tag: Tag) extends Table[Employee](tag, "emp") {
          def empId = column[Int]("id", O.PrimaryKey, O.AutoInc)
          def empName = column[String]("name", O DBType ("VARCHAR(100)"))
          def empType = column[String]("type")
          def * = (empName, empType, empId) <> (Employee.tupled, Employee.unapply)
        }
        val employees = TableQuery[Employees]
        val myInsert = employees.map(e => (e.empName, e.empType)) returning employees.map(_.empId) 
        val autoGenratedKey = myInsert.insert("satendra", "permanent")
于 2014-02-05T16:38:46.890 に答える