【问题标题】:How to get Slick create table statements to use InnoDB如何让 Slick 创建表语句以使用 InnoDB
【发布时间】:2017-03-25 18:43:17
【问题描述】:

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

【问题讨论】:

    标签: mysql scala innodb slick myisam


    【解决方案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 进行顺序执行。

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2017-04-25
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多