私はデータベースアクセスライブラリとしてslickを使用するscalaプロジェクトに取り組んでいます。私は複合キーがある次の定義で行を更新しようとしています。滑らかなcodegenでデータベースから生成されたコンポジットプライマリキーで行を更新
class TableName(tag: Tag) extends Table[TableName](tag, "table_name"){
def keyPart1 = column[String]("key_part_1", O.Length(100, varying = true))
def keyPart2 = column[String]("key_part_2", O.Length(100, varying = true))
// More columns defined
def pk = primaryKey("t_composite_pk", (keyPart1, keyPart2))
def * (keyPart1, keyPart2, ..more columns..) <> (TableNameRow.tupled, TableNameRow)
}
JdbcActionComponentのinsertOrUpdateメソッドまたはupdateメソッドを使用しても、値を挿入または更新できません。コンビネーションプライマリキー付きの滑らかな部分にはknown issueがあり、関連するべき識別子を特定できないため、これらのメソッドが正しく機能しないようにします。しかし、回避策があります。コンポジットの主キーを構成する行のパラメータとしてO.PrimaryKey値を追加すると、滑らかにキーを正しく判別できます。
class TableName(tag: Tag) extends Table[TableName](tag, "table_name"){
def keyPart1 = column[String]("key_part_1", O.Length(100, varying = true), O.PrimaryKey)
def keyPart2 = column[String]("key_part_2", O.Length(100, varying = true), O.PrimaryKey)
// More columns defined
def pk = primaryKey("t_composite_pk", (keyPart1, keyPart2))
def * (keyPart1, keyPart2, ..more columns..) <> (TableNameRow.tupled, TableNameRow)
}
このプロジェクトは、今やslick codegenを使用するように移行され、コードスキーマはデータベースのスキーマから動的に生成されるようになりました。この生成されたスキーマには、複合主キーの回避策はありません。
insertOrUpdateまたはupdateを使用できるようにするために、複合主キーを使用してコードジェネリック関数を作成する方法はありますか?コード生成は、複合主キーのためのいくつかのサポートを持っている、それだけで次の値を生成するためのものです:
/** Primary key of TableName(database name table_name_pk) */
val pk = primaryKey("table_name_pk", (keyPart1, keyPart2))
しかしこれは正しく行を識別することができるように滑らかなために十分であることが表示されません。これを実行できない場合は、これらの行を更新するために使用できる他の方法がありますか?
codegenを使用し、生成テーブルのスカラ定義をコミットしないようにするポリシーは、生成されたファイルの変更がオプションではないためです –