2005-08-17 Í¥¤·¤¤Rails¤Î°é¤ÆÊý [ĹǯÆüµ­]

¡ü [rails] Migration

¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¹¥­¡¼¥Þ(Êѹ¹)¤ò´ÉÍý¤¹¤ëµ¡Ç½¤Ç¤¹¡£¤â¤ì¤Ê¤¯¤³¤ó¤ÊÆÃŵ¤¬¤Ä¤¤¤Æ¤­¤Þ¤¹¡£

  • ±¿ÍѴĶ­¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ð¡¼¥¸¥ç¥ó¤ò¾å¤²¤ë¤È¤­¤Ë¡¢¥¹¥­¡¼¥ÞÊѹ¹¤Îϳ¤ì¤¬¤Ê¤¯¤Ê¤ë¡£
  • ¶¦Æ±³«È¯¼Ô¤¬¤¤¤ë¾ì¹ç¡¢rake °ìȯ¤Ç¼«Ê¬¤Î¤È¤³¤í¤Ë¥¹¥­¡¼¥ÞÊѹ¹¤òÈ¿±Ç¤Ç¤­¤ë¡£(svn update ¤È rake migrate ¤Ï¥ï¥ó¥»¥Ã¥È¢ö)
  • ¥Ð¡¼¥¸¥ç¥ó¥³¥ó¥È¥í¡¼¥ë¤µ¤ì¤ë¤Î¤Ç¡¢Migration¤Ç´ÉÍý¤·¤Æ¤¤¤ëǤ°Õ¤Î»þÅÀ¤Î¥¹¥­¡¼¥Þ¤ËÌ᤹¤³¤È¤¬²Äǽ¡£

¥¹¥­¡¼¥ÞÊѹ¹¤Ï ActiveRecord::Migration ¤Î¥µ¥Ö¥¯¥é¥¹¤òºî¤Ã¤ÆÄêµÁ¤·¤Þ¤¹¡£¥ê¥Ó¥¸¥ç¥ó´ÉÍý¤·¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢³Æ¥Ð¡¼¥¸¥ç¥óËè¤Ë1¤Ä¤Î¥¯¥é¥¹¤òÄɲ乤뤳¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î¥¯¥é¥¹¤ÎÃæ¤ÇÄêµÁ¤·¤¿ up, down ¤È¤¤¤¦¥¯¥é¥¹¥á¥½¥Ã¥É¤ÎÆâÍÆ¤¬¡¢¤½¤ì¤¾¤ì¥¢¥Ã¥×¥°¥ì¡¼¥É¤È¥À¥¦¥ó¥°¥ì¡¼¥É»þ¤Î½èÍý¤È¤·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Rails ¤Ç¤Ï Migration ÍѤΠgenerator ¤È rake ¥³¥Þ¥ó¥É¤¬½àÈ÷¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¤µ¤é¤ËÁàºî¤¬´Êñ¤Ç¤¹¡£

¡ü ¥¹¥­¡¼¥ÞÊѹ¹Ì¿Îá

up ¤È down ¤ÎÄêµÁ¤Ç¤Ï¡¢¥¹¥­¡¼¥ÞÊѹ¹Áàºî¤òÃê¾ÝŪ¤Êµ­½Ò¤Ç¹Ô¤¦¤³¤È¤¬¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢(Âбþ¤¹¤ëDB¤Ç¤¢¤ì¤Ð)Á´¤Æ¤ÎDB¤ÇƱ°ì¤Îµ­½Ò¤¬²Äǽ¤Ë¤Ê¤ë¤«¤é¤Ç¤¹¡£(DBI¤ÈƱ¤¸»×ÁÛ)¡£°Ê²¼¤Î¥¹¥­¡¼¥ÞÁàºî¤¬ÍøÍѲÄǽ¤Ç¤¹¡£

  • create_table(name, options) ¥Æ¡¼¥Ö¥ë¤òºîÀ®¤¹¤ë¡£
    • options[:id] false ¤Ë¤·¤Ê¤¤¸Â¤ê¼ç¥­¡¼¤Î¥«¥é¥à('id')¤¬ºîÀ®¤µ¤ì¤ë¡£(default: true)
    • options[:primary_key] ¼ç¥­¡¼¤Î¥«¥é¥à̾¤ò»ØÄꤹ¤ë¡£(default: 'id')
    • options[:options] ¸åÃÖ¤¹¤ëǤ°Õ¤Îʸ»úÎó¡£("DEFAULT CHARSET=UTF-8" ¤Î¤è¤¦¤ËÍøÍÑ)
  • drop_table(name) ¥Æ¡¼¥Ö¥ë¤òºï½ü¤¹¤ë¡£
  • add_column(table_name, column_name, type, options) ¥«¥é¥à¤òÄɲ乤롣
    • type ¥«¥é¥à¤Î·¿¤ò»ØÄꤹ¤ë¡£ÍøÍѲÄǽ¤Ê·¿¤Î°ìÍ÷¤Ï¸å½Ò¡£
    • options[:default] ¥Ç¥Õ¥©¥ë¥ÈÃͤò»ØÄꤹ¤ë¡£(Îã :default => 1)
  • rename_column(table_name, column_name, new_column_name) ¥«¥é¥à̾¤ÎÊѹ¹(NotImplementedError)[0.13.1¸½ºß]
  • change_column(table_name, column_name, type, options) ¥«¥é¥à°À­¤ÎÊѹ¹(NotImplementedError)[0.13.1¸½ºß]
  • remove_column(table_name, column_name) ¥«¥é¥à¤Îºï½ü
  • add_index(table_name, column_name): ¥¤¥ó¥Ç¥Ã¥¯¥¹¤òÄɲ乤롣
  • remove_index(table_name, column_name): ¥¤¥ó¥Ç¥Ã¥¯¥¹¤òºï½ü¤¹¤ë¡£

¡ü ÂбþDB

¸½ºßÂбþ¤·¤Æ¤¤¤ëDB¤Ï¤Þ¤À2¤Ä¤À¤±¤Ç¤¹¡£

  • PostgreSQL
  • MySQL

¡ü ÍøÍѲÄǽ¤Ê¥«¥é¥à·¿(¤ÎÃê¾Ýɽ¸½)

Ãê¾Ýɽ¸½Ruby·¿PostgreSQL·¿MySQL·¿
:primary_keyFixnumserial primary keyint(11) DEFAULT NULL auto_increment PRIMARY KEY
:stringStringcharacter varying(255)varchar(255)
:textStringtexttext
:integerFixnumintegerint(11)
:floatFloatfloatfloat
:datetimeTimetimestampdatetime
:timestampTimetimestampdatetime
:timeTimetimestampdatetime
:dateDatedatedate
:binaryStringbyteablob
:booleanObjectbooleantinyint(1)

¡ü Rails ¤ÇÍøÍѤ¹¤ë¾ì¹ç¤Îή¤ì

1. ¿·¤·¤¤ Migration ÄêµÁ¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë
  % ruby script/generate migration my_new_migration
2. Migration ¤ÎÆâÍÆ¤òÄêµÁ¤¹¤ë
  % vi db/migrate/1_my_new_migration.rb
3. Migration ¤ò¼Â¹Ô¤¹¤ë
  % rake migrate

¡ü Î㣱¡Ê¥«¥é¥à¤ÎÄɲáË

´û¸¤Î¥Æ¡¼¥Ö¥ë(members)¤Ë¿·¤·¤¤¥«¥é¥à(unitcode)¤òÄɲ䷤Ƥߤޤ·¤ç¤¦¡£

psql# \d members
  Column  |            Type             | Modifiers 
----------+-----------------------------+-----------
 code     | integer                     | 
 name     | character varying(32)       | 
 birthday | timestamp without time zone | 

º£²ó¤ÎÊѹ¹ÍѤÎMigrationÄêµÁ¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¥¢¥Ã¥×¥°¥ì¡¼¥É¤È¥À¥¦¥ó¥°¥ì¡¼¥É¤ÎÄêµÁ¤ò¤·¤Þ¤¹¡£

% ruby script/generate migration members_unitcode
     create  db/migrate
     create  db/migrate/1_members_unitcode.rb

% vi db/migrate/1_members_unitcode.rb
  class MembersUnitcode < ActiveRecord::Migration
    def self.up
      add_column(:members, :unitcode, :integer, :default=>1)
    end

    def self.down
      remove_column(:members, :unitcode)
    end
  end

Migration¤ò¼Â¹Ô¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£

% rake migrate

¤Á¤ã¤ó¤ÈÈ¿±Ç¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¡¢¥¹¥­¡¼¥Þ¤ò³Îǧ¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£¥Ð¡¼¥¸¥ç¥ó´ÉÍýÍѤΠ'schema_info' ¤È¤¤¤¦¥Æ¡¼¥Ö¥ë¤â¼«Æ°Åª¤ËºîÀ®¤µ¤ì¤Æ¤¤¤ë¤Ï¤º¤Ç¤¹¡£

psql# \d members
  Column  |            Type             | Modifiers 
----------+-----------------------------+-----------
 code     | integer                     | 
 name     | character varying(32)       | 
 birthday | timestamp without time zone | 
 unitcode | integer                     | default 1

psql# SELECT * FROM schema_info;
 version 
---------
       2

(¤³¤ì2¤Ë¤Ê¤ë¤ó¤Ç¤¹¤è¤Í¡£¤É¤³¤Þ¤ÇÅö¤Æ¤¿¤«¤À¤È1¤ò´üÂÔ¤·¤¿¤ó¤Ç¤¹¤¬¡£¼¡¤ÎMigration¥Õ¥¡¥¤¥ë¤¬3¤Ë¤Ê¤Ã¤Á¤ã¤¦¤·)

¡ü Î㣲¡Ê¥Æ¡¼¥Ö¥ë¤ÎÄɲáË

ÀèÄø¤Î members ¥Æ¡¼¥Ö¥ë¤ò MySQL ¤ÇÄêµÁ¤¹¤ë¾ì¹ç¡¢MigrationÄêµÁ¤Ï¤³¤ó¤Ê´¶¤¸¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£

class AddTableMember < ActiveRecord::Migration
  def self.up
    options = {
      :primary_key => "code",    # 'id' ¤Ç¤Ê¤¯¤Æ 'code' ÇɤʤΤÇ
      :options     => "ENGINE=MyISAM DEFAULT CHARSET=ujis"
    }
    create_table(:members, options) {|table|
      table.column :name       , :string   , :limit => 32
      table.column :birthday   , :datetime
    }

    # ½é´üÃͤâÆþ¤ì¤Æ¤ß¤ë (º£²ó¤Î update ¤Ç Member ¥â¥Ç¥ë¤¬Äɲäµ¤ì¤Æ¤ë¤Ï¤º¤Ê¤Î¤ÇÍøÍÑ)
    Member.create(:name=>"²Æ¾Æ²í"   , :birthday=>'1992-08-25')
    Member.create(:name=>"к ¡Çw¡Ç)", :birthday=>'1992-11-20')
    ...
  end

  def self.down
    drop_table :members
  end
end
mysql> describe members;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| code     | int(11)     |      | PRI | NULL    | auto_increment |
| name     | varchar(32) | YES  |     | NULL    |                |
| birthday | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

¡ü Î㣳¡ÊľÀÜSQL¤ò¼Â¹Ô¤¹¤ë¡Ë

DB¤ÎÆ©²áÀ­¤Î¤¿¤á¤ËÃê¾ÝŪ¤ÊÁàºîÌ¿Îá¤Çµ­½Ò¤·¤Æ¤¤¤Þ¤·¤¿¤¬¡¢Ä¾ÀÜSQL¤òµ­½Ò¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£´û¸¤ÎÁàºî¤Ç¤Ïɽ¸½ÉÔ²Äǽ¤Ê¤è¤ê¹âÅ٤ʥ¯¥¨¥ê¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤Ê¤É¤ËÌòΩ¤Á¤Þ¤¹¡£execute (ActiveRecord::Base.connection.execute) ¤ÇSQL¤òľÀܼ¹Ԥ·¤Þ¤¹¡£(ºÇ°­¡¢¤³¤³¤ÇÉáÄÌ¤Ë CREATE TABLE ... ¤ò½ñ¤¯¤Î¤â¤¢¤ê¤«¤â)¡£

class AddUpdateTrigger < ActiveRecord::Migration
   def self.up
     execute(<<-SQL)  
       create function f_recorded_upd() returns trigger as '
         begin
           new.min := extract(epoch from new.stop-new.start)/60;
           new.date := case when extract(''hour'' from new.start) < 5 then
               to_char(new.start - interval ''1 day'', ''YYYYMMDD'') else
               to_char(new.start, ''YYYYMMDD'') end;
           return new;
         end;
       ' language 'plpgsql';
       create trigger recorded_upd before insert or update on recorded for each row
         execute procedure f_recorded_upd();
     SQL
   end

   def self.down
     execute(<<-SQL)  
       drop trigger recorded_upd on recorded cascade;
       drop function f_recorded_upd();
     SQL
   end
 end

( ActiveRecord::Base.connection.execute ¤ÇǤ°Õ¤Î¥¯¥¨¥ê¤¬¼Â¹Ô¤Ç¤­¤¿¤ó¤Ç¤¹¤Í¡£ÊÙ¶¯¤Ë¤Ê¤ë¤Ê¤¡)

¡ü Î㣴¡Ê¥¹¥­¡¼¥ÞÊѹ¹°Ê³°¤ÎÍÑÅÓ¡Ë

¥¹¥­¡¼¥ÞÊѹ¹°Ê³°¤ÎÍÑÅӤˤâÍøÍѤǤ­¤Þ¤¹¡£Î㤨¤Ð¡¢ÌÀ¤é¤«¤Ë¤ª¤«¤·¤¤¥á¡¼¥ë¥¢¥É¥ì¥¹¤Î¥Ç¡¼¥¿¤Ïºï½ü¤¹¤ë¤³¤È¤Ë¤Ê¤Ã¤¿¾ì¹ç¡£

class ValidateEmail < ActiveRecord::Migration
  def self.up
    Users.find(:all).each do |user|
      user.destroy unless user.email.include?('@')
    end
    # ¥¨¥ó¥È¥ê¿ô¤¬Â¿¤¤¤ÈÃϹö¤Ê¤Î¤ÇËÜÈÖ¤Ç¤Ï execute ¤Ç¥¯¥¨¥ê½ñ¤­¤½¤¦¤À¤±¤É...
  end
 
  def self.down
    # ¤³¤ì¤ÏÌ᤻¤Ê¤¯¤Æ¤è¤¤¤Î¤Ç̵»ë
  end
end

¡ü ¤ª¤Þ¤±

к¡Çw¡Ç) ¡ãÊ£¿ô¤ÎMigration¤ò°ìµ¤¤Ë¼Â¹Ô¤¹¤ë¤È¤­Å¬ÍѤνçÈÖ¤ÏÂç¾æÉפʤΤ«¤Ê¡©

ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ãºî¤Ã¤¿½çÈÖ¤ÇÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤¬¿ôÃÍÉÕ¤±¤µ¤ì¤Æ¤ë¤«¤éÂç¾æÉפ衣

Àî ¡­¡¦_¡¦¡®ŽØ ¡ãµÕ¤Ë¡¢¹¥¤­¤Ê½çÈÖ¤ËÆþ¤ìÂØ¤¨¤¿¤ê¥Þ¡¼¥¸¤·¤¿¤ê¤â¤Ç¤­¤ë¤ó¤Ç¤¹¤Í¡£

½£*¡Æ o¡ÆŽØ ¡ãÈÖ¹æ¤òľÀܤ¤¤¸¤Ã¤¿¤é schema_info ¤Î version ¤È¤ÎÉÔÀ°¹ç¤Ï¼«¸ÊÀÕǤ¤Ç¤Í¡£

кoT¡¼Tк¡ã¤¢¤¦¤¡¡Á¡¢¤¨¡Á¤ª¡Á¤¢¡Á

ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¥Æ¡¼¥Ö¥ë¤ª¤«¤·¤¯¤Ê¤Ã¤¿¤Î¤Í¡£¤â¤¦µã¤«¤Ê¤¤¤Î¡£rake migrate VERSION=5 ¤È¤«¤Ç rollback ¤Ç¤­¤ë¤«¤é¡£

к¡Çw¡Ç) ¡ãMigrationÄêµÁ¥Õ¥¡¥¤¥ë¤ÎƬ¤Î¿ôÃͤò VERSION ¤Ç»ØÄꤹ¤ì¤Ð¤¤¤¤¤ó¤À¤Í¡ª

к ¡­¢à¡®Ðº¡ã¤Á¤Ê¤ß¤Ë¡¢rake migrate VERSION=0 ¤Ç°ìÈֺǽé¤Î¾õÂÖ¤ËÌá¤ì¤Þ¤¹¤è¡¼¡£

кoT¡¼Tк¡ã¤¢¤¦¤¡¡Á¡¢¤ª¡Á¤¢¡Á¤ª¡Á

ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ãproduction ¤ËÈ¿±Ç¤µ¤»¤¿¤¤¤Î¤Í¡£rake environment RAILS_ENV=production migrate ¤Ç»ØÄê²Äǽ¤è¡£

ŽÙ üý-üýŽØ ¡ãÃê¾Ýɽ¸½¤Ç¥Æ¡¼¥Ö¥ëÄêµÁ¤·¤Æ¤¿¤é¡¢development ¤Ï PostgreSQL ¤Ç production ¤Ï MySQL ¤Æ¤Î¤â³Ú¤À¤Ê¡£

¡Ê¡­(Ž´)¡®¡Ë޲ ¡ã.Ž¡oO(¤½¤ó¤ÊÊÑÂ֥ץ쥤¤Ï¤ª¤á¡¼¤À¤±¤À¤è¡£¤³¤Î¥Ñ¥ó¥Ä´Ý½Ð¤·¥¢¥¤¥É¥ë¤¬¡ª)

к¡Çw¡Ç) ¡ã¥Ç¥ì¥Ç¥ì!!¥·¥ó¥Ç¥ìLOVE!!¥¯¥¥¡¼¥ó¢ö¥¯¥¥¡¼¥ó¢ö

ËÜÆü¤Î¥Ä¥Ã¥³¥ß(Á´1·ï) [¥Ä¥Ã¥³¥ß¤òÆþ¤ì¤ë]
_ teru (2006-12-19 14:07)

ºÇ¶á¡¢Migration¤Ë¤Ï¤Þ¤Ã¤Æ¤Þ¤¹¡£<br>¤Á¤Ê¤ß¤Ë¡¢¥Ù¥ê¤Î²Æ¾Æ²í¤Á¤ã¤ó¤¬Åо졪¤Ê¤´¤ß¤Þ¤¹¤Í¤§¡¦¡¦^^;²í¤Á¤ã¤ó¤Ï¡¢1992-08-25¤Ê¤ó¤Ç¤¹¤Í^^;


¥µ¥¤¥ÈÆâ¸¡º÷ (by Google)

| JRuby | Rails | Berryz | ¡î-ute | ¥¨¥Ã¥° | jQuery |

²áµî

Á° 2005ǯ
8·î
¼¡
Æü ·î ²Ð ¿å ÌÚ ¶â ÅÚ
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

̤Íè

¥³¥ó¥¿¥¯¥È