我正在使用光滑的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))
然而,这并不显得不够光滑,能够正确识别的行。如果这不能起作用,还有其他方法可以用来更新这些行吗?
这是政策,使用codegen和不提交生成表scala定义,因此修改生成的文件不是一个选项 –