我可以用 Slick 的 Table class 定义 table 的 ROW_FORMAT 吗?

Can I define a table's ROW_FORMAT with Slick's Table class?

我正在研究使用压缩 table 来节省存储空间 space 的可能性。我发现 https://dev.mysql.com/doc/refman/5.5/en/innodb-compression-tuning.html 显示了一些用于设置它的示例代码,并且我能够使用下面所示的命令将其中一个测试 table 的大小从 1.6GB 减少到 0.5GB链接示例。

如果我在 mysql 控制台中 运行 show create table my_big_compressed_table\G(从技术上讲,MariaDB 没问题,但我认为这在这里不重要),我得到

CREATE TABLE `my_big_compressed_table` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  -- some more fields
  -- indexes, foreign keys, etc
) ENGINE=InnoDB <some stuff omitted> ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4

最后一行是重要的一点:ROW_FORMATKEY_BLOCK_SIZE 是打开压缩的魔法词,但我找不到用 Slick 定义它们的方法。

class MyBigCompressedTable(tag: Tag) extends Table[...](tag, "MY_BIG_COMPRESSED_TABLE") {
  def id = column[Int]("ID", ...)
  // more fields, indexes, foreign keys
  def * = (id, ...)

  // TODO: rowFormat? keyBlockSize?
}

Slick 是否提供定义 ROW_FORMATKEY_BLOCK_SIZE 设置的方法?如果是这样,如何?我希望避免手动编写 table 创建逻辑。 FWIW,我目前坚持使用 Slick 2.1。

查看代码,我认为它不受开箱即用的支持。我认为您可以通过引入一个继承自 MySQLDriver. That driver should override createTableDDLBuilder to return a subclass of super.TableDDLBuilder that in turn would override createTable 方法的自定义 "driver" 来实现它。在覆盖的 createTable 中,您可以添加一些自定义逻辑,例如分析 Table[_] 是否也实现了一些已知的标记特征并相应地修改生成的 SQL。