Sei sulla pagina 1di 6

1 AcIiveRecordMigrIion - Ruby - Comix (reIurbished)

22/02/13 19:26:2S hIIp://gomix.Iedor-ve.org/pro|ecIs/ruby/wiki/AcIiveRecordMigrIion


ActveRecord
ActiveRecord::Migrtion
ActveRecord::Mraton
E|empo smpe
E|empo menos smpe
Transformacones dsponbes
Transformacones rreversbes
Creacn ye|ecucn de mratons desde
Ras
Ms e|empos
Soportede base de datos
Uso de un modeo despus de cambar su
taba
Contro de verbosdad
Acercade a taba schema_mratons
Mracones con marcade tempo
Mracones reversbes
Mratons con e comando Rake
rake db:mrate
rake db:mrate:status
rake db:roback
Referencas
Losmratons (mracones) pueden mane|ar aevoucn de esquema utzado por varasbases dedatos. Es unasoucn a probema comn de
arear un campo parauna nueva funconadad en su basede datos y de no estar muy seurode cmo empu|ar os cambos y notfcar a sus
compaeros ene desarroo y haca aapcacn en produccn. Conas mraconesde ARusted puede descrbr as transformacones enuna case
autocontenda quepuede nsertar en su sstemade contro de versonesy e|ecutaras versus abase de datos quepuede ben estar una, doso cnco
versonesatrasada.
Ejemplo simple
1class AddSsl < Acl1vRcord..M1ral1on
2 di up
3 add_column .cunlas, .ssl_hab1l1lado, .boolan, .diaull => 1
4 nd
5
6 di doWn
7 rmov_column .cunlas, .ssl_hab1l1lado
8 nd
9nd
Esta mracnarear unabandera de tpo boo a ataba cuents y remover dcha coumna s est devovendo e cambo de dcha mracn.
Muestracomo todas asmracones tenen dosmtodos, up y down, que descrben astransformacones requerdas a mpementar o remover a
momentode e|ecutar a mracn. Dchos mtodospueden consstr detanto os mtodos especfcosde mracn comoadd_coumn y remove_coumn
perotambn pueden contener cdo Ruby reuar para enerar datos necesaros para astransformacones.
Ejemplo menos simple
Une|empo unpoco ms compe|oque requere ncazar datos sue a contnuacn:
1class AddSyslmSll1ns < Acl1vRcord..M1ral1on
2 di up
3 cral_labl .ausls_dl_s1slma do ]l]
4 l.slr1n .nombr
5 l.slr1n .l1qula
6 l.lxl .valor
7 l.slr1n .l1po
8 l.1nlr .pos1c1on
9 nd
10
11 SyslmSll1n.cral .nombr => "nol1c",
12 .l1qula => "us nol1c?",
13 .valor => 1
14 nd
15
16 di doWn
17 drop_labl .ausls_dl_s1slma
18 nd
19nd
2 AcIiveRecordMigrIion - Ruby - Comix (reIurbished)
22/02/13 19:26:2S hIIp://gomix.Iedor-ve.org/pro|ecIs/ruby/wiki/AcIiveRecordMigrIion
Esta mracnprmero areaa tabaa|ustes_de_sstema, ueo crea a prmerafa endcha taba utzando e modeo Actve Recordque est
soportadopor dcha taba. Tambn se haceuso de asntaxs ms avanzada de create_tabe endonde usted puede especfcar e esquema competo de
ataba enun amada tpoboque.
Trnsformciones disponibles
crete_tble(nombre, opciones): Crea unataba amadanombre y dsponbzae ob|eto tabaa boqueque puede areare coumnas
suendoe msmo formatoque dd_column. E hashopcones es para framentoscomo "DEFAULT CHARSET=UTF-8" queson areados a a
defncnen a creacn de ataba.
drop_tble(nombre): Emna ataba amadanombre.
renme_tble(old_nombre, new_nombre): Renombra a tabaamadaold_nombre a new_nombre.
dd_column(tble_nombre, column_nombre, tipo, opciones): Area una nueva coumna a ataba table_nombreamada colmn_
nombreespecfcada con e tpode datos: :strn, : text, : nteer, : foat, :decma, :datetme, :tmestamp, :tme, :date, :bnary, :booean. Sepuede
especfcar un vaor por omsnpasando un hashopciones como { :defaut => 11 }. Otras opcones posbesson :mt y :nu (e.. { :mt =>
50, :nu => fase}).
renme_column(tble_nombre, column_nombre, new_column_nombre): Renombrauna coumna mantenendo e tpo de dato y e
contendo.
chnge_column(tble_nombre, column_nombre, tipo, opciones): Camba e tpo de unacoumna a un tpo dferenteutzando os
msmosparmetros que dd_column.
remove_column(tble_nombre, column_nombres): Remuevea coumnas stadasen colmn_nombresde a tabaamada table_
nombre.
dd_index(tble_nombre, column_nombres, opciones): Area un ndcecon e nombrede a coumna. Otras opconesncuyen :name,
:unque(e.. { :name => "users_nombre_ndex", :unque=> true }) y :order (e.. { :order => {:name => :desc} }).
remove_index(tble_nombre, :column => column_nombre): Remueve e ndce especfcado por colmn_nombre.
remove_index(tble_nombre, :nme => index_nombre): Remueve e ndceespecfcado por index_nombre.
Trnsformciones irreversibles
Aunastransformacones son destructvasde formasque no pueden ser reversadas. Las mraconesde este tpodeben anzar aexcepcn
ActveRecord:: IrreversbeMraton ensu mtodo down.
Crecion y ejecucion de migrtions desde Rils
E paquete Ras tenevaras herramentas paraayudare en acreacn y a apcacn deas mracones. Para aeneracn deun nuevo mraton
puede usar:
ra1ls nral m1ral1on M1NuvaM1rac1on
endonde MNuevaMracon es e nombre desu mraton. E enerador crear un archvo de mraton vaco cone nombre marcadetempo_my_new_
mraton.rb en e drectoro db/mrate/ endonde marcadetempo es a fechay hora con formatoUTC en que fu enerado e archvo.
Lueo puede ustededtar os mtodosp y down en MNuevaMracon.
Hay un ata|osntctvo para enerar os mratons quepuede arer campos a unataba.
ra1ls nral m1ral1on add_i1ldnam_lo_lablnam i1ldnam.slr1n
Esto enerare archvo tmestamp_add_fedname_to_tabename, que ucr como:
1class AddI1ldnamToTablnam < Acl1vRcord..M1ral1on
2 di up
3 add_column .lablnams, .i1ldnam, .slr1n
4 nd
5
6 di doWn
7 rmov_column .lablnams, .i1ldnam
8 nd
9nd
Paraapcar as mraconesversus a basede datos actuamente confurada, userake db:migrate. Esto actuazara base dedatos e|ecutando todosos
mratonspendentes creandoa tabaschema_migrations s no exsta ya. Tambn se nvocara tarea db: schema:dump queactuazar e archvo db/
schema.rb paraque concdacon a estructurade su base dedatos.
Paradevover a basede datos a unaversn preva, use rakedb:mrate VERSION=X en donde X es aversn a a que deseadevoverse. S cuaquer
deos mratons anza unaexcepcn ActveRecord: :IrreversbeMraton dcho pasofaar y usted tendr que reazar e traba|o manuamente.
Ms ejemplos
Notodas as mraconescamban e esquema. Aunossmpemente reparanos datos deauna manera.
1class RmuvTasvac1os < Acl1vRcord..M1ral1on
2 di up
3 AcIiveRecordMigrIion - Ruby - Comix (reIurbished)
22/02/13 19:26:2S hIIp://gomix.Iedor-ve.org/pro|ecIs/ruby/wiki/AcIiveRecordMigrIion
3 Ta.all.ach { ]la] la.dslroy 1i la.pa1nas.mply? )
4 nd
5
6 di doWn
7 # no podmos hacr nada para rslaurar los dalos prd1dos
8 ra1s Acl1vRcord..Trrvrs1blM1ral1on, "No s pudn rcuprar las l1m1nados"
9 nd
10nd
Otrasmracones remueven coumnas cuando mranhaca adeante envez de haca atrsen e esquema:
1class RmuvAlr1bulosTlmTnncsar1os < Acl1vRcord..M1ral1on
2 di up
3 rmov_column .1lms, .canl1dad_1lms_1ncompllos
4 rmov_column .1lms, .canl1dad_1lms_compllados
5 nd
6
7 di doWn
8 add_column .1lms, .canl1dad_1lms_1ncompllos
9 add_column .1lms, .canl1dad_1lms_compllados
10 nd
11nd
Aunasveces necesta hacer ao con SOL que no est actuamentecuberto por asabstraccones de as mraconesde Actve Record:
1class RacrJo1nun1co < Acl1vRcord..M1ral1on
2 di up
3 xcul "ALTER TABLE `pa1nas_nlazadas_pa1nas` A00 uNTuE `pa1na_1d_pa1na_nlazada_1d` {`pa1na_
1d`,`pa1na_nlazada_1d`}"
4 nd
5
6 di doWn
7 xcul "ALTER TABLE `pa1nas_nlazadas_pa1nas` 0R0P TN0EX `pa1na_1d_pa1na_nlazada_1d`"
8 nd
9nd
Soporte de bse de dtos
Lasmracones ARestn actuamente soportadaspara MySOL, PostreSOL, SOLte, SOL Server, Sybase y Orace(todasas bases dedatos soportadas
exceptoDB2).
Uso de un modelo despues de cmbir su tbl
Aunasveces ustedquerr arear unacoumna en una mracny pobara nmedatamentedespus. En dcho caso, usted necestar hacer una
amadaa Base#reset_coumn_nformaton cona fnadad de aseurarsede quee modeo teneos datos ms recentesacerca de sus coumnas
despus dehaber sdoareada a nueva coumnda. E|empo:
1class ArarSalar1oPrsona < Acl1vRcord..M1ral1on
2 di up
3 add_column .prsona, .salar1o, .1nlr
4 Prsona.rsl_column_1niormal1on
5 Prsona.all.ach do ]p]
6 p.updal_allr1bul .salar1o, CalculadoraSalar1o.compul{p}
7 nd
8 nd
9nd
Control de verbosidd
Por omsnas mraconesdescrbrn asaccones que se estn e|ecutandoescrbndoas en aconsoa en amedda en que se vane|ecutando |untocon
asmedcones de tempodescrbendo qu tanto se tarda cadauna.
Ustedpuede sencaras a|ustando ActveRecord: :Mraton.verbose= fase.
Tambnpuede nsertar sus propos mensa|es y medcones usando e mtodosay_wth_tme:
1di up
2 ...
3 say_W1lh_l1m "Aclual1zando salar1os..." do
4 Prsona.all.ach do ]p]
5 p.updal_allr1bul .salar1o, CalculadoraSalar1o.compul{p}
4 AcIiveRecordMigrIion - Ruby - Comix (reIurbished)
22/02/13 19:26:2S hIIp://gomix.Iedor-ve.org/pro|ecIs/ruby/wiki/AcIiveRecordMigrIion
6 nd
7 nd
8 ...
9nd
Lafrase "Actuazandosaaros..." sera entoncesmpresa |untoa as medcones para e boque cuando e boque se compete.
Acerc de l tbl schem_migrtions
Rasverson 2.0 y anterores creabanuna tabaamadaschema_nfocuando usaban as mracones. Esta tabacontena aversn de esquema de
acuerdoa a tma mracn.
Apartr de Ras 2.1 ataba schema_nfo es automtcamenterempazada ataba schema_mratons quecontene os nmerosde versn de todas as
mraconesapcadas.
Comoresutado ahora es posbearear archvos demracones quesean numeradas menor a aversn actua de esquema: cuando mrehaca
adeante, dchas mraconesntercaadasno apcadas sern automtcamente apcadas y cuando mrehaca atrs, as mraconesntercaadasno
apcadas prevamentesern evtadas.
Migrciones con mrc de tiempo
Por omsnRas eneramracones queucen como:
20120717013526_nombr_su_m1rac1on.rb
E pref|o a nombrees una marcad de tempoen formatoUTC.
S prefere usar pref|os numrcos smpes, puede desactvcar asmracones conmarca de tempo:
1coni1.acl1v_rcord.l1mslampd_m1ral1ons = ials
enappcaton.rb.
Migrciones reversibles
Apartr de Ras 3.1 es posbedefnr mracones reversbes. Lasmracones reversbesson mracones quesaben comor haca atrs (down) por
usted. Ustedsmpemente sumnstra aca de r haca adeante(up) y e sstema de mraconessabr cmo e|ecutar haca atrs(down) por usted.
Paradefnr una mracn reversbedefna e mtodochane en su mracn, as:
1class M1rac1onElanl < Acl1vRcord..M1ral1on
2 di chan
3 cral_labl{.anda} do ]l]
4 l.column .conln1do, .lxl
5 l.column .rcurdam_l, .dall1m
6 nd
7 nd
8nd
Esta mracncrear a tababurros por usted a r haca adeantey automtcamente sabr cmoemnar ataba cuando mrehaca atrs (down).
Aunoscomandos como remove_coumn no pueden reversarse. S desea ocuparsede defnr como r adeantey atrs, debe defnr osmtodos up y
downcomo ya se ha expcado prevamente.
S un comando no puede ser reversado se anzar unaexcepcn ActveRecord:: IrreversbeMraton cuando amracn haca atrssea e|ecutada.
Parasaber cues son os comandos reversbesvea ActveRecord: :Mraton: :CommandRecorder.
Migrtions con el comndo Rke
rak db.aborl_1i_pnd1n_m1ral1ons # Ra1ss an rror 1i lhr ar
pnd1n m1ral1ons
rak db.cral # Cral lh dalabas di1nd
1n coni11dalabas.yml ior lh currnl RATLS_ENv
rak db.cral.all # Cral all lh local
dalabass di1nd 1n coni11dalabas.yml
rak db.drop # 0rops lh dalabas ior lh
currnl RATLS_ENv
rak db.drop.all # 0rops all lh local dalabass
di1nd 1n coni11dalabas.yml
rak db.m1ral # M1ral lh dalabas lhrouh
scr1pls 1n db1m1ral and updal db1schma.rb by 1nvok1n db.schm
S AcIiveRecordMigrIion - Ruby - Comix (reIurbished)
22/02/13 19:26:2S hIIp://gomix.Iedor-ve.org/pro|ecIs/ruby/wiki/AcIiveRecordMigrIion
a.dump. Tarl spc1i1c vrs1on W1lh vERST0N=x. Turn oii oulpul W1lh vERB0SE=ials.
rak db.m1ral.doWn # Runs lh "doWn" ior a 1vn
m1ral1on vERST0N.
rak db.m1ral.rdo # Rollbacks lh dalabas on
m1ral1on and r m1ral up.
rak db.m1ral.rsl # Rsls your dalabas us1n
your m1ral1ons ior lh currnl nv1ronmnl
rak db.m1ral.up # Runs lh "up" ior a 1vn
m1ral1on vERST0N.
rak db.rsl # 0rops and rcrals lh
dalabas irom db1schma.rb ior lh currnl nv1ronmnl.
rak db.rollback # Rolls lh schma back lo lh
prv1ous vrs1on.
rak db.schma.dump # Cral a db1schma.rb i1l
lhal can b porlably usd aa1nsl any 0B supporld by AR
rak db.schma.load # Load a schma.rb i1l 1nlo
lh dalabas
rak db.slruclur.dump # 0ump lh dalabas slruclur
lo a SL i1l
rak db.lsl.clon # Rcral lh lsl dalabas
irom lh currnl nv1ronmnl`s dalabas schma
rak db.lsl.clon_slruclur # Rcral lh lsl dalabass
irom lh dvlopmnl slruclur
rak db.lsl.load # Rcral lh lsl dalabas
irom lh currnl schma.rb
rak db.lsl.prpar # Chck ior pnd1n m1ral1ons
and load lh lsl schma
rak db.lsl.pur # Emply lh lsl dalabas
rak db.vrs1on # Rlr1vs lh currnl schma
vrs1on numbr
rke db:migrte
$ rak db.m1ral
== CralTaproduclos. m1ral1n =============================================
-- cral_labl{.laproduclos}
-> 0.0916s
== CralTaproduclos. m1rald {0.0927s} ====================================
== Cral0llms. m1ral1n ================================================
-- cral_labl{.dllms}
-> 0.0025s
== Cral0llms. m1rald {0.0071s} =======================================
rke db:migrte:sttus
$ rak db.m1ral.slalus
dalabas. db1dvlopmnl.sql1l3
Slalus M1ral1on T0 M1ral1on Nam
--------------------------------------------------
doWn 20120730235624 Cral produclos
doWn 20120730235724 Cral laproduclos
doWn 20120731003205 Cral dllms
$ rak db.m1ral.slalus
dalabas. db1dvlopmnl.sql1l3
Slalus M1ral1on T0 M1ral1on Nam
--------------------------------------------------
up 20120730235624 Cral produclos
doWn 20120730235724 Cral laproduclos
doWn 20120731003205 Cral dllms
rke db:rollbck
$ rak db.rollback
6 AcIiveRecordMigrIion - Ruby - Comix (reIurbished)
22/02/13 19:26:2S hIIp://gomix.Iedor-ve.org/pro|ecIs/ruby/wiki/AcIiveRecordMigrIion
$ rak db.rollback
== Cral0llms. rvrl1n ================================================
-- drop_labl{"dllms"}
-> 0.0011s
== Cral0llms. rvrld {0.0071s} =======================================
$ rak db.rollback STEP=2
== Cral0llms. rvrl1n ================================================
-- drop_labl{"dllms"}
-> 0.0010s
== Cral0llms. rvrld {0.0049s} =======================================
== CralTaproduclos. rvrl1n =============================================
-- drop_labl{"laproduclos"}
-> 0.0009s
== CralTaproduclos. rvrld {0.0027s} ====================================
Referencis
http:/ /ap.rubyonras.or/casses/ ActveRecord/Mraton.htm