使用Slick的代码生成器时,如何过滤掉列?

问题描述 投票:4回答:2

我正在使用Slick codegen工具并过滤掉表并成功重命名表和列。但是,如何跳过为不需要的列生成代码?

例如,在使用unwanted时,如何排除items表中的SourceCodeGenerator列?

scala slick
2个回答
3
投票

您可以按以下方式排除列:

  1. 覆盖工厂方法Table
  2. 从模型中排除列。
  3. 从新模型创建表。

E.g:

new SourceCodeGenerator(model) {    
  override def Table = model => {
    val columns = 
      if (model.name.table == "items") model.columns.filterNot(column => column.name == "unwanted") 
      else model.columns
    new Table(model.copy(columns = columns)
  }
}

0
投票

在Slick 3.3.0中,我不得不覆盖列的启用标志,并停止为索引和外键生成代码以使其工作:

val optDesiredColumns = Map(
    "table_1" -> Set("col_1", "col_2"),
    "table_2" -> Set("col_2", "col_3")
) 

val codegenFuture =  modelFuture.map { m =>
    val model = m
    new SourceCodeGenerator(model = model) {
    override def Table = tableModel => {
        val optDesiredColumns = tableNameToDesiredColumns.get(tableModel.name.table)
        new TableDef(tableModel) {
            override def Column = columnModel => {
                new ColumnDef(columnModel) {
                    override def enabled: Boolean = {
                        val rv = optDesiredColumns.map(desiredColumns =>
                            desiredColumns.contains(columnModel.name)).
                                getOrElse(super.enabled)
                        println(s"***** ${tableModel.name.table}.${columnModel.name} enabled = $rv")
                        rv
                    }
                }
            }

            override def Index = indexModel => {
                new IndexDef(indexModel)  {
                    override def enabled: Boolean = false
                }
            }

            override def ForeignKey = fkModel => {
                new ForeignKeyDef(fkModel)  {
                    override def enabled: Boolean = false
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.