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

When using Slick's code generator, how do I filter out columns?

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

例如,使用SourceCodeGenerator时如何排除itemstable中的unwanted列?

您可以排除如下列:

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

例如:

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)
  }
}

在 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
                }
            }
        }
    }
}