2016-04-29 34 views
1

我正在使用光滑的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的或更新的方法呢?代码生成确实有复合主键一些支持,但它只是为下面的值的产生:

/** Primary key of TableName(database name table_name_pk) */ 
val pk = primaryKey("table_name_pk", (keyPart1, keyPart2)) 

然而,这并不显得不够光滑,能够正确识别的行。如果这不能起作用,还有其他方法可以用来更新这些行吗?

+0

这是政策,使用codegen和不提交生成表scala定义,因此修改生成的文件不是一个选项 –

回答

0

通过检查有关更新的其他帖子来确定是否使用了此post中的过滤器(...)。update(...)。它可以用下面的办法来更新:

// 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中的某些函数。