我最近学习了Slick和Scala,发现Slick创建的数据库表使用MYISAM,似乎这是MySQL配置中的默认引擎,Slick create table语句没有指定引擎。这一切都很好,但我想在不更改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生成多个语句,比如additional
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"))
}
}
您不能使用
traverse
或map
来创建未来,因为alter table
取决于已经存在的表。使用flatMap
进行顺序执行。关于mysql - 如何获取Slick创建表语句以使用InnoDB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43020441/