gpt4 book ai didi

mysql - 如何让 Slick create table 语句使用 InnoDB

转载 作者:行者123 更新时间:2023-11-29 02:45:28 25 4
gpt4 key购买 nike

我最近选择了 Slick 和 Scala,并意识到我的数据库表是由 Slick 使用 MYISAM 创建的,这似乎是我的 MySQL 配置上的默认引擎,而 Slick 创建表语句没有指定引擎。这一切都很好,但我想在不更改 MySQL 中的默认表引擎的情况下更改为 InnoDB。华而不实的文档与此事无关。无论如何,在不修改 MySQL my.ini 中的默认引擎的情况下,是否可以使用 Slick(在创建表之前)更改表引擎?

最佳答案

您可以定义引擎或以其他方式通过操纵语句来扩展查询:

    val statements: Iterator[String] = myTableQuery.schema.createStatements
val action: SqlAction[Int, NoStream, Effect] =
sqlu"#${createStatement.mkString(" ")} engine=InnoDB"
db.run(createAction)

注意为 sqlu 插值器使用 # 逐字插值前缀 - 没有它,语句将被转义,导致语法错误。

查看相关文档:http://slick.lightbend.com/doc/3.2.3/schemas.html#data-definition-language

编辑:

我注意到,如果 DDL 生成多个语句(例如附加的 alter table...),该方法将不起作用。在这种情况下,还有一个更不优雅的解决方案:

def createTable(ddl: profile.DDL, db: Database)(implicit ec: ExecutionContext): Future[Int] = {

val mapped = ddl.createStatements.toList map (
s => if (s.startsWith("create table")) s"$s engine=InnoDB" else s
)
mapped.foldLeft(Future.successful(1)) {
case (acc: Future[Int], s: String) =>
acc.flatMap(_ => db.run(sqlu"#$s"))
}
}

您不能使用traversemap 来创建 future ,因为alter table 取决于已经存在的表。使用 flatMap 进行顺序执行。

关于mysql - 如何让 Slick create table 语句使用 InnoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43020441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com