sequelのmigrationで列にcharacter setを指定する方法

RubyのsequelというORMライブラリがあります。

細かい使い方はQiitaにいくつか記事があるのでそちらを参照するとして、今回はMySQLで以下のような列にcharacter setが指定してあるDDLを発行させる方法のメモ書きです。

確認したバージョンは sequel 4.2.0, adapterにmysql2 0.3.13です。 

create table example1(
  id bigint not null,
  url varchar(255) character set ascii not null,
  constraint pk primary key (id)
) engine=InnoDB, default character set='utf8mb4';

先にMySQLにテーブルを作ってdumpをしても、認識してくれません(´・ω・`)

bundle exec sequel -e development ./config/database.yml -d
Sequel.migration do
  change do
    create_table(:example1) do
      primary_key :id, :type=>Bignum
      String :url, :size=>255, :null=>false
    end
  end
end
bundle exec sequel -e development ./config/database.yml -D
Sequel.migration do
  change do
    create_table(:example1) do
      primary_key :id, :type=>"bigint(20)"
      column :url, "varchar(255)", :null=>false
    end
  end
end

これを実行しても、列に指定してあるcharacter setがおちてしまいます。あと create table のオプションに InnoDB, utf8が出ています。utf8mb4 を指定したのに・・。このへんは Sequel::MySQL.default_engine Sequel::MySQL.default_charset Sequel::MySQL.default_collate あたりで設定するみたいです。今回はcreate_tableの時に指定してみます。

mysql> show create table example1 \G;
*************************** 1. row ***************************
       Table: example1
Create Table: CREATE TABLE `example1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR:
No query specified

というわけで、以下のように修正してみました。まず、create_table する時に明示的に engine と charset を指定しました。 また列定義で明示的に character set asciiを追加しました。オマケでchangeからup/downに変更しています。

Sequel.migration do
  up do
    create_table(:example1, :engine => 'InnoDB', :charset=>'utf8mb4') do
      primary_key :id, :type=>"bigint(20)"
      column :url, "varchar(255) character set ascii", :null=>false
    end
  end
  down do
    drop_table(:example1)
  end
end

↑を実行すると、↓のような結果にできました。

mysql> show create table example1 \G;
*************************** 1. row ***************************
       Table: example1
Create Table: CREATE TABLE `example1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) CHARACTER SET ascii NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

ERROR:
No query specified

ただし、この方法だとRDB間の差異は吸収できません。String :url, :size=>255, :charset=>'ascii'と書けると嬉しいんですけどね・・。知ってる人いたら教えてください。

 

新しいサイトもよろしくお願いします!