Slick 3.2 CodeGenerator Tool 在自动生成的代码中硬编码数据库名称

Slick 3.2 CodeGenerator Tool hardcodes the database name in the autogenerated code

我正在使用 slick 3.2 代码生成工具,我根据我的生产数据库自动生成了代码。在生成的代码中我可以看到

class BarActivity(_tableTag: Tag) extends profile.api.Table[BarActivityRow](_tableTag, Some("foo_prod"), "bar_activity") {

此处 foo_prod 是代码生成器 运行 所针对的数据库。

问题是对于多个环境,我的数据库的命名方式不同。所以 dev 数据库是 foo_dev 而 qa 数据库是 foo_qa.

我不想每次切换环境时都生成数据库文件。我想跨环境使用相同的生成代码。

我认为 slick 应该允许我们从连接属性中指定数据库名称。

那么对于自动生成的代码,我该如何编写一个有两个连接的问题。一个从 prod 读取数据,第二个将数据写入 dev?我应该生成两次代码吗?

您可以根据需要自定义输出: 您正在查看的位置的默认值在 AbstractSourceCodeGenerator.scala -> TableClassDef 特征中,在 code 方法中。

所以,假设你有一个 class class MyGenerator extends SourceCodeGenerator(model) { 你可以添加进去

override def Table = new Table(_) {
  override def TableClass = new TableClassDef {
    override def code =  {
       val prns = parents.map(" with " + _).mkString("")
       s"""class $name(_tableTag: Tag) extends profile.api.Table[$elementType](_tableTag, ${hereGoesTheDatabaseNameAndTheTableNameComaSeparated})$prns {
  ${indent(body.map(_.mkString("\n")).mkString("\n\n"))}"""
         }
      }
    }

在您的情况下,您可能希望变量 hereGoesTheDatabaseNameAndTheTableNameComaSeparated 从某些配置文件或环境变量中获取数据库名称,例如?

完全免责声明:我自己从未定制过这部分,但我看不出这是行不通的重要原因。