我遇到了同样的问题,我发现了这个问题。 S.Karthik 的回答让我朝着正确的方向前进。但是,答案中的代码稍微过时了。而且我认为有点过于复杂。所以我制定了自己的解决方案:
import slick.codegen.SourceCodeGenerator
import slick.driver.JdbcProfile
import slick.model.Model
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, ExecutionContext}
val slickDriver = "slick.driver.PostgresDriver"
val jdbcDriver = "org.postgresql.Driver"
val url = "jdbc:postgresql://localhost:5432/mydb"
val outputFolder = "/path/to/src/test/scala"
val pkg = "com.mycompany"
val user = "user"
val password = "password"
object MySourceCodeGenerator {
def run(slickDriver: String, jdbcDriver: String, url: String, outputDir: String,
pkg: String, user: Option[String], password: Option[String]): Unit = {
val driver: JdbcProfile =
Class.forName(slickDriver + "$").getField("MODULE$").get(null).asInstanceOf[JdbcProfile]
val dbFactory = driver.api.Database
val db = dbFactory.forURL(url, driver = jdbcDriver, user = user.orNull,
password = password.orNull, keepAliveConnection = true)
try {
// **1**
val allSchemas = Await.result(db.run(
driver.createModel(None, ignoreInvalidDefaults = false)(ExecutionContext.global).withPinnedSession), Duration.Inf)
// **2**
val publicSchema = new Model(allSchemas.tables.filter(_.name.schema.isEmpty), allSchemas.options)
// **3**
new SourceCodeGenerator(publicSchema).writeToFile(slickDriver, outputDir, pkg)
} finally db.close
}
}
MySourceCodeGenerator.run(slickDriver, jdbcDriver, url, outputFolder, pkg, Some(user), Some(password))
我会解释这里发生了什么:
- 我从
slick-codegen 库中的SourceCodeGenerator 类复制了run 函数。 (我使用的版本是slick-codegen_2.10-3.1.1。)
-
// **1**:在原始代码中,生成的Model 被称为m 的val 引用。我将其重命名为allSchemas。
-
// **2**:我创建了一个新的Model (publicSchema),使用来自原始模型的options,并使用来自原始模型的tables 集的过滤版本。事实证明,public 模式中的表在模型中没有得到模式名称。因此isEmpty。如果您需要来自一个或多个其他模式的表,您可以轻松创建不同的过滤器表达式。
-
// **3**:我用创建的publicSchema 模型创建了一个SourceCodeGenerator。
当然,如果 Slick 代码生成器可以合并一个选项来选择一个或多个模式,那就更好了。