2016-04-29 11 views
1

私はデータベースアクセスライブラリとして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)) 

しかしこれは正しく行を識別することができるように滑らかなために十分であることが表示されません。これを実行できない場合は、これらの行を更新するために使用できる他の方法がありますか?

+0

codegenを使用し、生成テーブルのスカラ定義をコミットしないようにするポリシーは、生成されたファイルの変更がオプションではないためです –

答えて

0

この更新プログラムに関するその他の投稿を確認すると、この(postからのフィルタ(...)。更新(...)の使用が確認されました。更新するには、次のアプローチを使用することが可能である:

// Where the following was defined by the codegen 
/** Collection-like TableQuery object for table TableName*/ 
lazy val TableName = new TableQuery(tag => new TableName(tag)) 

// We can then filter on the primary key values 
def updateMethod(row: TableNameRow) = 
    TableName 
     .filter(x => x.keyPart1 === row.keyPart1 && x.keyPart2 === row.keyPart2) 
     .update(row) 

私たちがフィルタを介してキーをエミュレートすることを考えると複合キーを持つ行の更新を許可するように適用することができます。ただし、これは回避策であり、JdbcActionComponentの特定の関数の使用を許可していません。

関連する問題