如何使用Slick创建表语句来使用InnoDB

时间:2017-03-25 18:43:18

标签: mysql scala innodb slick myisam

我最近选择了Slick和Scala,并实现了Slick使用MYISAM创建的数据库表,看来这是我的MySQL配置的默认引擎,Slick create table语句没有指定引擎。这一切都很好,但我想在不更改MySQL中的默认表引擎的情况下更改为InnoDB。光滑的文档没有任何关于此事。无论如何用Slick(在创建表之前)更改表引擎而不修改MySQL my.ini中的默认引擎?

1 个答案:

答案 0 :(得分:1)

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

    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来创建期货,因为alter table取决于已存在的表格。使用flatMap进行顺序执行。