Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2010年11月30日]

Sequel にてプライマリキーに文字列項目を使う方法

2010年12月01日 02:34更新 筆者:K.Ktouth

Sequel にてプライマリキーに文字列項目を使う方法。
ちょっとハマったので自分メモ。

(以下、コード羅列)

テーブル生成

まずテーブルを生成する場合。
primary_key を単純に指定した場合はデータベース側で自動生成される整数項目になるので、明示的に指定します。

DB.create_table(:examples) do
 String :code, :primary_key => true, :null => false, :unique => true
 # 以下省略
end
DB.create_table(:seconds) do
 String :code, :null => false
 Integer :offset, :null => false
 primary_key [:code, :offset]
 # 以下省略
end

:null および :unique 項目はおそらく蛇足ですが一応。プライマリキーが複数ある場合は後者の方法で。

これらのテーブルを参照する場合、参照キーの指定に foreign_key 指定は使えません。内部で Integer に項目が固定されているからです。
これらのテーブルを参照するキーを作りたい場合は……

DB.create_table(:foreign_keys) do
 # プライマリキー省略
 String :example_code, :table => :examples, :key => code, :null => false, :on_delete => :cascade
 # 以下省略
end

foreign_key は上記のように各オプションにテーブル名を加えた整数項目を作っているだけなので、これで全く同等の項目が作れます。

モデルでの操作

Sequel::Model を使ってモデルクラスを作って操作する場合、通常の整数プライマリキー項目はデータベースで自動生成されることが前提になるため、参照専用になっていて編集が出来ません。
ですが文字列をキーにした場合は自前でキーデータを準備する必要がありますが、その値をモデルクラスに反映する方法が標準では禁止=提供されていません。
これを編集可能にするには以下のようにします。
またこれらのモデルとそれを参照するモデルは、各々のアソシエーション項目に :key を明示しておくべきです。

class Example < Sequel::Model(:examples)
 unrestrict_primary_key
 one_to_meny :foreign_keys, :key => :example_code
end
class ForeignKey < Sequel::Model(:foreign_keys)
 unrestrict_primary_key
 meny_to_one :example, :key => :code
end

なお、モデルクラスを使わずデータセットから直接テーブルに項目を追加する場合はプライマリキーを明示して登録可能です(もちろん値の検証などは自前で済ましておく必要があります)。

本日のリンク元
その他のリンク元
検索