際際滷

際際滷Share a Scribd company logo
Rose::DB Perl ORM 亶 舒
弌仂亰亟舒仄 从仍舒  从仂仆仆亠从仂仄 从 弍舒亰亠 package My::DB; use warnings; use strict; use base qw(Rose::DB); __PACKAGE__->use_private_registry; __PACKAGE__->register_db( driver  => 'mysql', type   => 'main', database => 'databasename', host  => '.***.***', username => 'user', password => '', connect_options => {  AutoCommit => 1,   RaiseError => 1,  } );  1;
亳 仂仄, 亳于舒亠仄, 仂 于  Rose :: DB  亠于亠 2 仗舒舒仄亠舒 仗仂亟从仍ム亠仆亳 从 弍舒亰亠:  type  亳   domain. 丐.仂. 于 仄仂亢亠亠 于舒亳仂于舒 仄亠亢亟 亟亠于亠仍仂仗亠从仂亶 亳 仗仂亟舒从仆  弍舒亰仂亶    仂亟亳仆舒从仂于仄亳 从舒仄亳 亟舒仆仆. 仍 仂 仄仂亢仆仂 仂仗亳舒 仆亠从仂仍从仂 于亰仂于仂于 仄亠仂亟舒  register_db .  亟仂从仄亠仆舒亳亳 仗亳于仂亟亳 亟舒亢亠 仗亳仄亠: use My::DB; if($ENV{'MYCORP_PRODUCTION_SERVER'}) { My::DB->default_domain('production'); } else { My::DB->default_domain('development'); } 仆舒仍仂亞亳仆仂 仄仂亢仆仂 从舒亰于舒 亳 default_type 亟仍 从仂仆仆亠从舒.  Rose::DB::Cache   仂仗亳于舒亠 于舒亳舒仆 舒弍仂 仗仂亟  mod _ perl  /弍亠亰 亳仗仂仍亰仂于舒仆亳  Apache :: DBI
仍亳于舒亠仄 从仍舒 舒弍仍亳 亳亰 弍舒亰 #!/usr/bin/perl use strict; use warnings; use lib '/home/****/'; use My::DB; use Rose::DB::Object::Loader; my $loader = Rose::DB::Object::Loader->new( db => My::DB->new('main'), class_prefix => 'My::DB', with_foreign_keys => 1, with_relationships => 1 ); $loader->make_modules(module_dir=>'/home/****/',exclude_tables=>'Tmp'); exit;  亟舒仆仆仂仄 仍舒亠 仗亠亠亟舒 亟仂仗 仗舒舒仄亠  'Tmp' , 仂弍 亳从仍ム亳 舒弍仍亳  /Tmp/ (regexp)  亳亰 亳仂亞仂于仂亞仂 仆舒弍仂舒 舒弍仍亳. 亳 仂仄 亳于舒亠仄, 仂 亠仍亳  于舒 亢亠 亠 从仍舒  仂仗亳舒仆亳亠仄 舒弍仍亳 (仂 于仂亳仄亳   从舒仂仄仆仄亳 亟仂弍舒于从舒仄亳), 仂 仂仆亳 仗仂仂 仗亠亠亰舒. 丐舒从 亢亠 仆亢仆仂 亳于舒, 仂 亠仍亳  于舒 亠 仗仂仍  亳仗仂仄 char(), 仂 仂 弍亟亠 仂仄亠亠仆仂 于 从舒仍舒, 亳 从仂亞亟舒 于 弍亟亠亠 亰舒弍亳舒 亰仆舒亠仆亳 亳亰 亳亰 仂弍亠从舒 仂从亳 亟仍 亟舒仆仆仂亶 舒弍仍亳, 亰仆舒亠仆亳亠 弍亟亠 亟仂仗仂仍仆亠仆仂 仗仂弍亠仍舒仄亳 亟仂 束x損 亳仄于仂仍仂于.
仂仗亳仄  于舒 亠 从仍舒  My::DB::MlPerson  亟仍 仗仂仍亠仆亳 仂弍亠从舒 仂从亳,    person _ id  亟仂舒仂仆仂 亟舒: $p = My::DB::MlPerson->new(person_id=>74952020)->load  从仂仆从仂 仗亠亠亟舒 仗亠于亳仆亶 亳仍亳 仆亳从舒仍仆亶 从仍ム. 束仂亞亰从舒損 亟舒仆仆 仗仂亳亰仂亶亟 仂仍从仂 于 仄仂仄亠仆  load . 仂亢亠 舒从 仍亳, 仂 于 弍舒亰亠 仆亠 仂从亳  从亰舒仆仆仄 亰仆舒亠仆亳亠仄 从仍ム舒, 亳 仂亞亟舒 于舒仄 于亠仆  warn . 仂从仂仍从 亳仄亠 舒从亳亠 仂弍亳于从亳 仆亠 亳仆亠亠仆仂, 亟舒 亳 仆亠 仆舒亞仍磲仆仂, 亠从仂仄亠仆亟亠 亳仗仂仍亰仂于舒 从仂仆从亳  亳仗仂仍亰仂于舒仆亳亠仄 仗舒舒仄亠舒 speculative: unless($p->load(speculative => 1)) { warn "not found"; } 仂仍亳仄 亳 亳亰仄亠仆亳仄 亰仆舒亠仆亳亠 仗仂仍  password  亟仍 仆舒亠亶 仗亠仂仆: $p->password; $p->password('new_pass'); 亳 舒仆仂于从亠 亰仆舒亠仆亳 于 仗仂仍亠, 仗仂于亠磳 亠亞仂 于舒仍亳亟仆仂 仆舒 仂仂于亠于亳亠 于 仂仗亳舒仆亳亳 从仍舒舒. 弌仂舒仆亳仄 亳亰仄亠仆仆仆亶 仂弍亠从 仂从亳 于 弍舒亰亠 ( update ): $p->save; 弌仂亰亟舒亟亳仄 仆仂于 亰舒仗亳 于 弍舒亰亠: $p = My::DB::MlPerson->new(person_id=>74952020,password=>'pass'); $p->save ;  亟舒仆仆仂仄 从仂仆亠从亠 (仂亰亟舒仆亳亠 亰舒仗亳亳), 于 从仂仆从仂 仂于亠仄 仆亠仂弍磶舒亠仍仆仂 仗亠亠亟舒于舒 舒于仂-亳仆从亠仄亠仆亳亠仄亶 从仍ム. 丕亟舒仍亠仆亳亠 亰舒仗亳亠亶 舒弍仂仍ム仆仂 弍亠亳仂仆仂: $p = My::DB::MlPerson->new(person_id=>74952020); $p->delete; 舒从 于亳亟仆仂,  load  于 亟舒仆仆仂仄 仍舒亠 仆亠 亠弍亠.
丐亠仗亠 仗亠亠亶亟仄 从 于仂仗仂舒仄 弍仂仍亠亠 仍仂亢仆 亰舒仗仂仂于 于 弍舒亰 仂亞亟舒 于 于仍亳于舒仍亳 从 舒弍仍亳 于 从仍舒, 仂 亟仍 从舒亢亟仂亶 舒弍仍亳 弍仍亳 仂亰亟舒仆 2 仄仂亟仍 (仆舒 仗亳仄亠亠 MlPerson): My::DB::MlPerson My::DB::MlPerson::Manager 亟亠仂仍仂亞亳 仂仂亳 于 仂仄, 仂 亠仍亳 于舒仄 亠弍亠 仂亰亟舒 仆亠从亳亶 亟仂仗仂仍仆亳亠仍仆亶 仄亠仂亟 亟仍 舒弍仍亳, 从仂仂亶 弍 于仂亰于舒舒仍 仂弍舒弍仂舒仆仆仂亠 亰仆舒亠仆亳亠 亳仄亠ム亳 仗仂仍亠亶, 仂 仂 亟仂弍仆仂 亟亠仍舒 于 My::DB::MlPerson. 亳仄亠仂仄 磦仍磳 仍舒亶, 从仂亞亟舒  于舒 于 仗仂仍亠 舒仆亳 亠亳舒仍亳亰仂于舒仆仆舒 从舒 亟舒仆仆. 弌从舒亢亠仄, 亠亳舒仍亳亰仂于舒仆仆舒 亠亠亰  Storable.  亳仄亠 亟仍 舒从仂亞仂 仗仂仍  stor_field: package My::DB::MlPerson;  . use Storable qw(thaw freeze); $Storable::interwork_56_64bit = 1; sub alias_to_stor_field{ my ($row_obj,$new_val) = @_; if ($new_val and ref $new_val) { #  舒于亳仄   仆仂于仂亠   亰仆舒亠仆亳亠 $row_obj->stor_field(freeze($new_val)); return 1; } elsif ($row_obj->stor_field) { #  亟亠亠亳舒仍亳亰亠仄 亳仄亠ム亠亠 return thaw($row_obj->stor_field); } ; return undef; }
仂 于仂 从仂亞亟舒 仆舒仄 亠弍亠 仂弍舒弍仂舒 仆舒弍仂 仂从, 于仗舒亠 于 于仂 亳仍 My::DB::MlPerson::Manager.  舒仄仂仄 仄仂亟仍亠 于 于亳亟亳亠: __PACKAGE__->make_manager_methods(' 舒亰于舒仆亳亠丐舒弍仍亳舒亰亠 '); 亅仂 仄亠仂亟 亟亠仍舒亠 亟仂仗仆仄亳 仍亠亟ム亳亠 仄亠仂亟 亟仍 从仍舒舒 My::DB::MlPerson::Manager: get_舒亰于舒仆亳亠丐舒弍 仍 亳舒亰亠 get_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠_iterator get_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠_count delete_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠 update_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠 舒从 ,  亟仍 仆舒亠亶 舒弍仍亳  ml_person , 仂 弍亟: My::DB::MlPerson::Manager->get_ml_person 于仂亰于舒舒亠 仍从 仆舒 仄舒亳于 于亠 仂从 于 舒弍仍亳亠 (仂 亟仂弍仆仂 于 仂亠仆 亠亟从亳 仍舒, 从仂亞亟舒 仂弍舒舒亠 仗仂 亳仆亟亠从, 舒 仆亠 舒亰仄亠仆仂于于舒亠 仄舒亳于. , 于 舒于仆仂, 仆亠 亟仂弍仆仂.) My::DB::MlPerson::Manager->get_ml_person_iterator 于仂亰于舒舒亠 亳亠舒仂 亟仍 仂弍仂亟舒 于亠亶 舒弍仍亳. my $i = My::DB::MlPerson::Manager->get_ml_person_iterator; while( my $p = $i->next ) { print $p->name; $i-> finish   if(...); } 仆亞 仆舒 仍亳仂.  于 弍仍仂 弍 仂于亠仄 仗仍仂仂,
 亳 仄亠仂亟 仄亠ム 仗亳仆亳仄舒 舒亞仄亠仆 亟仍 仂仆亠仆亳 亠亰仍舒仂于 仗仂亳从舒 亳 于仂亰于舒舒 仂仂于亠于ム亠亶 仍从亳 仆舒 仄舒亳于 亳仍亳 亳亠舒仂: my $i = My::DB::MlPerson::Manager->get_ml_person_iterator( query => [ name => {like => '%Hat'}, person_id  => {ge => 7}, or  =>  [ age => 15, age => {lt => 10}, ], ], sort_by => 'name', limit  => 10, offset  => 50 ); while( my $p = $i->next ) { print $p->name; $i-> finish   if(...); } 亅亳   舒亞仄亠仆   从于亳于舒仍亠仆仆   从于亠亠: SELECT person_id, name, age,,password FROM ml_person WHERE name LIKE '%Hat' AND person_id >= 7 AND (age = 15 OR age < 10.00) ORDER BY name LIMIT 10 OFFSET 50
舒仍亠亠 , My::DB::MlPerson::Manager->get_ml_person_count 于仂亰于舒舒亠 亳仍仂 亰舒仗亳亠亶 于 舒弍仍亳亠. 丐舒从 亢亠 仄亠亠 仗亳仆亳仄舒 舒亞仄亠仆, 仂弍 从仂仆从亠亳亰亳仂于舒  where  于 亰舒仗仂亠 仆舒 仗仂亟. My::DB::MlPerson::Manager->delete_ml_person 亟舒仍磳 亰舒仗亳亳 于 仂仂于亠于亳亳  仗亠亠亟舒仆仆仄亳 舒亞仄亠仆舒仄亳. My::DB::MlPerson::Manager->update_ml_person 仂弍仆仂于仍磳 亰舒仗亳亳 于 仂仂于亠于亳亳  仗亠亠亟舒仆仆仄亳 舒亞仄亠仆舒仄亳. 亟亠 仂亳 仂仄亠亳, 从舒从 仗亠亠亟舒 舒亞仄亠仆  set  于 从于亠: My::DB::MlPerson::Manager->update_ml_person( set => { age => 25, }, where => [ age => 24, person_id  => { gt => 100 }, ] ) ;  仍ミ頴笑 亳亰 从仍舒仂于-仂仗亳舒仆亳亶 舒弍仍亳, 于 仄仂亢亠亠 于弍舒 亳仍 仗仂亟从仍ム亠仆亳, 亠仍亳 仗亠亠亞亰亳亠 仄亠仂亟: 弌仂弍于亠仆仆仂亠 仗仂亟从仍ム亠仆亳亠 从 弍舒亰亠:  sub init _ db  {  My :: DB -> new  } 仗仂仍亰仂于舒 亢亠 仂亰亟舒仆仆仂亠 亳仍亳 仆仂于仂亠:  sub init _ db  {  My :: DB -> new _ or _ cached  }
 于亠亞亟舒 仄仂亢亠亠 仗仂仍亳 仂弍亠从  My :: DB $p = My::DB::MlPerson->new(...); $db = $p->db; , 仂亞舒仆亳亰仂于舒 舒仆亰舒从亳仂仆仆亶 仄亠舒仆亳亰仄 (亠仍亳 舒于仂从仂仄仄亳 仂从仍ム亠仆): $p = My::DB::MlPerson->new(...); $db = $p->db; $db->begin_work; #  舒舒仍仂   舒仆亰舒从亳亳 # 仗仂仍亰亠仄 仆舒 $db 亟仍 从舒亢亟仂亞仂 仂亰亟舒于舒亠仄仂亞仂 仂弍亠从舒-仂从亳 $p1 = My::DB::MlPerson->new(name => 'Bike', db => $db); $p1->save; $p2 =  My::DB::MlPerson ->new(name => 'Sled', db => $db); $p2->save; $p3 = My::DB::MlPerson->new(name => 'Kite', db => $db); $p3->save; if(...) # 亳仄亠仆磳仄 亳亰仄亠仆亠仆亳 亳仍亳 仂从舒于舒亠仄 { $db->commit; } else { $db->rollback;  } ;  亠仗亠 于亠仆仄 从  My :: DB  亳 于仂亰仄仂亢仆仂亳 亠亞亳亳仂于舒 仆亠从仂仍从仂 从仂仆仆亠从仂于 从 弍舒亰舒仄, 亳亞舒 仗舒舒仄亠舒仄亳  type  亳  domain .
  仆舒 弍亟 仂仗亳舒仆 于  My :: DB  亟于舒 从仂仆仆亠从舒 亟仍 弍舒亰  仂亟亳仆舒从仂于仄亳  从舒仄亳. 亟仆舒   domain => production  亳 于仂舒   domain => archive .  舒亰仆舒亠仆亳亠 弍舒亰 仗仂仆仆仂. $production_db = My::DB->new('production'); $archive_db  = My::DB->new('archive'); # 舒亞亰亳仄  仗仂亟舒从仆 弍舒亰 亟舒仆仆亠 仗仂 从仂仆从亠仆仂亶 仗亠仂仆亠 $p = My::DB::MlPerson->new(person_id => 'John', db => $production_db); $p->load; # 弌从仂仗亳亠仄 亟舒仆仆亠 仗仂 仗亠仂仆亠 于 舒亳于 $p->db($archive_db); $p->save(insert => 1); # 舒亞仄亠仆 insert 仗仂亰于仂仍亳 仍亳弍仂 亰舒仗亳舒 仂从, 仍亳弍仂 仂弍仆仂于亳 亰仆舒亠仆亳  # 丕亟舒仍亳仄 仂弍仂亰仆舒亠仆仆 仗亠仂仆 亳亰 仗仂亟舒从仆 弍舒亰  $p->db($production_db); $p->delete; 舒仄仂亳仄 亰舒于亳亳仄仂亳. 仍亳  于舒 于 弍舒亰亠 仂仆亳 仆亠 弍仍亳 仗仂舒于仍亠仆, 仂 仗亳 亞亠仆亠舒亳亳 从仍舒仂于-舒弍仍亳, 于 亳 仂 亢亠 仆亠 于亳亟亳亠. 亠仍亠 于 仂仄, 仂 仄仂亢仆仂 仗仂仗亳舒 亳 从舒仄亳.
亠亟舒从亳亠仄 My::DB::MlPerson 亳 亟仂弍舒于亳仄 于 仄亠仂亟  setup  于仂 舒从仂亶 舒亞仄亠: foreign_keys => [ crm => { class  => 'My::DB::CrmBridge', key_columns => { person_id => 'f_person_id' },   relationship_type => 'one to one', }, ] 舒从, 仂  仆舒 亰亟亠: 仂亰亟舒仆舒 于磶 仄亠亢亟 从仍舒舒仄亳 (仆亠 舒弍仍亳舒仄亳): My::DB::MlPerson 亳 My::DB::CrmBridge. 仍亠亟ム亳仄 仂弍舒亰仂仄: ml _ person . person _ id   磦仍磳 于仆亠仆亳仄 从仍ム仂仄 亟仍  crm _ bridge . f _ person _ id . 弌仂仂于亠于亳亠 仂仗亠亟亠仍亠仆仂 从舒从 仂亟亳仆-从-仂亟仆仂仄. 弍舒亠仆亳亠 从 仂仆仂亠仆亳 亳亟 仗仂 仄亠仂亟  亳仄亠仆亠仄  crm .  relationship _ type  仄仂亢亠 舒从 亢亠 弍 亰舒仗亳舒仆 从舒从  rel _ type  (亳仆仂仆亳仄) , 亠仗亠 仄 仄仂亢亠仄 亟亠仍舒 于仂 舒从 从: $ p  =  My :: DB :: MlPerson->new(person_id=>74952020)->load; $p->crm->any_field 亞亟亠, any_field  - 仂 仍ミ頴笑 仗仂仍亠 亳亰 舒弍仍亳  crm _ bridge .
 仂弍亠仄-仂, 于 亟舒仆仆仂仄 仍舒亠 仄仂亢仆仂 弍仍仂 弍 亳 仂仗亳  rel _ type .  舒 亳 从 仂仄 亢亠, 仄仂亢亠仆仂 于仂仂弍亠 于仆亠亳 仂 舒亞仄亠仆 于 于亳亟亠 于亰仂于舒  仄亠仂亟舒 (仆仂 仂 于舒亢仆仂, 仂弍 仂 弍仍仂 仂仗亠亟亠仍亠仆仂 亟仂 于亰仂于舒  setup ): package My::DB::MlPerson; __PACKAGE__->meta->foreign_keys( 'crm' => { class  => 'My::DB::CrmBridge', key_columns => { person_id => 'f_person_id' } } ); __PACKAGE__->meta->setup( )  于仂, 亳仆亠亠仆亶 仍舒亶 从仂亞亟舒 仗亠仂仆舒 于仂亟亳 于 仆亠从仂仍从仂 亞仗仗 (于 仂仄 亢亠 从仍舒亠 My::DB::MlPerson 亟仂  setup ): __PACKAGE__->meta->relationships ( group => { type  => 'one to many', class  => 'My::DB::MlGroup', column_map => { person_id => 'f_person_id' }, }, ); 亟亠 仂弍仂亰仆舒亠仆仂 仂仆仂亠仆亳亠 仂亟亳仆-从仂-仄仆仂亞亳仄 (仂亟仆舒 仗亠仂仆舒 亳亰  ml _ persons  仄仂亢亠 亳仄亠 仆亠从仂仍从仂 亰舒仗亳亠亶 于  ml _ group ). 舒从 亢亠 仗仂仆仆仂, 仄仂亢仆仂 仂弍仂亰仆舒亳 仂 仂仆仂亠仆亳亠 亳 于 于亳亟亠 舒亞仄亠仆舒 于 仄亠仂亟亠  setup , 亠仍亳 于舒仄 舒从 亟仂弍仆亠亠.
丼仂   舒亰   仆亠   仗仂仆舒于亳仍仂 : $p = My::DB::MlPerson->new(person_id=>74952020)->load; $bor = $p->group; ref $bor eq 'ARRAY'; 亟亞亳仄亳 仍仂于舒仄亳  仗亳 仂弍舒亠仆亳亳 从 仂仆仂亠仆亳, 于 仗仂仍舒亠亠 仍从 仆舒 仄舒亳于 亳仍亳 仄舒亳于 (于 亰舒于亳亳仄仂亳 仂 从仂仆亠从舒). 舒 仍亳仂 磦仆舒 亳亰弍仂仆仂. 仂 亟仂从仄亠仆舒亳亳 仆亠 仆舒仍, 从舒从 仗仂仍亳 于仂亰仄仂亢仆仂 仂弍舒亳 从 仂仆仂亠仆亳  于仂亰仄仂亢仆仂 仂仆亠仆亳 亰舒仗仂舒 (亳仗舒 于弍舒 仂仍从仂 从仂仆从亠仆亠 亞仗仗 亟仍 仗亠仂仆) 弍亠亰 于亞亠弍舒仆亳 于亠 亰舒仗亳亠亶 亳亰  ml _ group .  亢 亠仄 弍仂仍亠亠, 于 仗仂亟舒从仆 于亠亞亟舒 亳仆亠亠仆亠亠 仗仂仍亳 亳亠舒仂, 舒   #@ ! , 弍仂仍亠亠 仂亞仂, 仗仂 亟亠仂仍 (舒 仂 仂亠于亳亟仆仂 仆舒舒亳于舒亠), 仗仂于仂仆仂亠 仂弍舒亠仆亳亠: $p->group; 亢亠 仆亠 舒仍仂 仍亠亰 于 弍舒亰 (舒 于亠亟 仂 仂仂仆 从仂-仂 仄仂亞 仗仂仄亠仆 亰仆舒亠仆亳亠 于 仂从舒 舒弍仍亳), 舒 仗仂仂 仂亟舒仍仂 亰仆舒亠仆亳亠 亳亰 亠舒 (!).  仂弍亠仄, 于 亟舒仆仆仂仄 于仂仗仂亠, 亳仄仂, 仍亳  DBIx :: Class . 丼仂 仄仂亢仆仂 仆舒亰于舒 亟仂弍仆仄, 舒从 仂 亟舒仍亠仆亳亠 亞仗仗, 于 从仂仂 仂仂亳 仗亠仂仆舒: $p = My::DB::MlPerson->new(person_id=>74952020)->load; $p-> group([ ]); $p->save;  于仂 仗亳仄亠 仂舒仍仆仂 亟舒仍亠仆亳 于亠 于磶舒仆仆 仂从: $p->delete(cascade => 1); 仍 亞仍弍仍亠仆亳 于仂仗仂舒 仗仂 仂仄 从舒从 仂舒于仍 从于亠亳, 亠从仂仄亠仆亟 仗仂仄仂亠 Rose::DB::Object::Manager, 亞亟亠 从 仂亢舒仍亠仆亳 仆亠 仆舒仍 仗亳仄亠舒 仗仂 于亰仂于 舒仆亳仄仂从. 丐亠仄 亳亠从 亳舒 仆亠 舒从仂亶, 仆仂 亟仍 弍仂亞仂 舒舒  于仗仂仍仆亠 亟仂舒仂仆仂.

More Related Content

Rose::DB

  • 2. 弌仂亰亟舒仄 从仍舒 从仂仆仆亠从仂仄 从 弍舒亰亠 package My::DB; use warnings; use strict; use base qw(Rose::DB); __PACKAGE__->use_private_registry; __PACKAGE__->register_db( driver => 'mysql', type => 'main', database => 'databasename', host => '.***.***', username => 'user', password => '', connect_options => { AutoCommit => 1, RaiseError => 1, } ); 1;
  • 3. 亳 仂仄, 亳于舒亠仄, 仂 于 Rose :: DB 亠于亠 2 仗舒舒仄亠舒 仗仂亟从仍ム亠仆亳 从 弍舒亰亠: type 亳 domain. 丐.仂. 于 仄仂亢亠亠 于舒亳仂于舒 仄亠亢亟 亟亠于亠仍仂仗亠从仂亶 亳 仗仂亟舒从仆 弍舒亰仂亶 仂亟亳仆舒从仂于仄亳 从舒仄亳 亟舒仆仆. 仍 仂 仄仂亢仆仂 仂仗亳舒 仆亠从仂仍从仂 于亰仂于仂于 仄亠仂亟舒 register_db . 亟仂从仄亠仆舒亳亳 仗亳于仂亟亳 亟舒亢亠 仗亳仄亠: use My::DB; if($ENV{'MYCORP_PRODUCTION_SERVER'}) { My::DB->default_domain('production'); } else { My::DB->default_domain('development'); } 仆舒仍仂亞亳仆仂 仄仂亢仆仂 从舒亰于舒 亳 default_type 亟仍 从仂仆仆亠从舒. Rose::DB::Cache 仂仗亳于舒亠 于舒亳舒仆 舒弍仂 仗仂亟 mod _ perl /弍亠亰 亳仗仂仍亰仂于舒仆亳 Apache :: DBI
  • 4. 仍亳于舒亠仄 从仍舒 舒弍仍亳 亳亰 弍舒亰 #!/usr/bin/perl use strict; use warnings; use lib '/home/****/'; use My::DB; use Rose::DB::Object::Loader; my $loader = Rose::DB::Object::Loader->new( db => My::DB->new('main'), class_prefix => 'My::DB', with_foreign_keys => 1, with_relationships => 1 ); $loader->make_modules(module_dir=>'/home/****/',exclude_tables=>'Tmp'); exit; 亟舒仆仆仂仄 仍舒亠 仗亠亠亟舒 亟仂仗 仗舒舒仄亠 'Tmp' , 仂弍 亳从仍ム亳 舒弍仍亳 /Tmp/ (regexp) 亳亰 亳仂亞仂于仂亞仂 仆舒弍仂舒 舒弍仍亳. 亳 仂仄 亳于舒亠仄, 仂 亠仍亳 于舒 亢亠 亠 从仍舒 仂仗亳舒仆亳亠仄 舒弍仍亳 (仂 于仂亳仄亳 从舒仂仄仆仄亳 亟仂弍舒于从舒仄亳), 仂 仂仆亳 仗仂仂 仗亠亠亰舒. 丐舒从 亢亠 仆亢仆仂 亳于舒, 仂 亠仍亳 于舒 亠 仗仂仍 亳仗仂仄 char(), 仂 仂 弍亟亠 仂仄亠亠仆仂 于 从舒仍舒, 亳 从仂亞亟舒 于 弍亟亠亠 亰舒弍亳舒 亰仆舒亠仆亳 亳亰 亳亰 仂弍亠从舒 仂从亳 亟仍 亟舒仆仆仂亶 舒弍仍亳, 亰仆舒亠仆亳亠 弍亟亠 亟仂仗仂仍仆亠仆仂 仗仂弍亠仍舒仄亳 亟仂 束x損 亳仄于仂仍仂于.
  • 5. 仂仗亳仄 于舒 亠 从仍舒 My::DB::MlPerson 亟仍 仗仂仍亠仆亳 仂弍亠从舒 仂从亳, person _ id 亟仂舒仂仆仂 亟舒: $p = My::DB::MlPerson->new(person_id=>74952020)->load 从仂仆从仂 仗亠亠亟舒 仗亠于亳仆亶 亳仍亳 仆亳从舒仍仆亶 从仍ム. 束仂亞亰从舒損 亟舒仆仆 仗仂亳亰仂亶亟 仂仍从仂 于 仄仂仄亠仆 load . 仂亢亠 舒从 仍亳, 仂 于 弍舒亰亠 仆亠 仂从亳 从亰舒仆仆仄 亰仆舒亠仆亳亠仄 从仍ム舒, 亳 仂亞亟舒 于舒仄 于亠仆 warn . 仂从仂仍从 亳仄亠 舒从亳亠 仂弍亳于从亳 仆亠 亳仆亠亠仆仂, 亟舒 亳 仆亠 仆舒亞仍磲仆仂, 亠从仂仄亠仆亟亠 亳仗仂仍亰仂于舒 从仂仆从亳 亳仗仂仍亰仂于舒仆亳亠仄 仗舒舒仄亠舒 speculative: unless($p->load(speculative => 1)) { warn &quot;not found&quot;; } 仂仍亳仄 亳 亳亰仄亠仆亳仄 亰仆舒亠仆亳亠 仗仂仍 password 亟仍 仆舒亠亶 仗亠仂仆: $p->password; $p->password('new_pass'); 亳 舒仆仂于从亠 亰仆舒亠仆亳 于 仗仂仍亠, 仗仂于亠磳 亠亞仂 于舒仍亳亟仆仂 仆舒 仂仂于亠于亳亠 于 仂仗亳舒仆亳亳 从仍舒舒. 弌仂舒仆亳仄 亳亰仄亠仆仆仆亶 仂弍亠从 仂从亳 于 弍舒亰亠 ( update ): $p->save; 弌仂亰亟舒亟亳仄 仆仂于 亰舒仗亳 于 弍舒亰亠: $p = My::DB::MlPerson->new(person_id=>74952020,password=>'pass'); $p->save ; 亟舒仆仆仂仄 从仂仆亠从亠 (仂亰亟舒仆亳亠 亰舒仗亳亳), 于 从仂仆从仂 仂于亠仄 仆亠仂弍磶舒亠仍仆仂 仗亠亠亟舒于舒 舒于仂-亳仆从亠仄亠仆亳亠仄亶 从仍ム. 丕亟舒仍亠仆亳亠 亰舒仗亳亠亶 舒弍仂仍ム仆仂 弍亠亳仂仆仂: $p = My::DB::MlPerson->new(person_id=>74952020); $p->delete; 舒从 于亳亟仆仂, load 于 亟舒仆仆仂仄 仍舒亠 仆亠 亠弍亠.
  • 6. 丐亠仗亠 仗亠亠亶亟仄 从 于仂仗仂舒仄 弍仂仍亠亠 仍仂亢仆 亰舒仗仂仂于 于 弍舒亰 仂亞亟舒 于 于仍亳于舒仍亳 从 舒弍仍亳 于 从仍舒, 仂 亟仍 从舒亢亟仂亶 舒弍仍亳 弍仍亳 仂亰亟舒仆 2 仄仂亟仍 (仆舒 仗亳仄亠亠 MlPerson): My::DB::MlPerson My::DB::MlPerson::Manager 亟亠仂仍仂亞亳 仂仂亳 于 仂仄, 仂 亠仍亳 于舒仄 亠弍亠 仂亰亟舒 仆亠从亳亶 亟仂仗仂仍仆亳亠仍仆亶 仄亠仂亟 亟仍 舒弍仍亳, 从仂仂亶 弍 于仂亰于舒舒仍 仂弍舒弍仂舒仆仆仂亠 亰仆舒亠仆亳亠 亳仄亠ム亳 仗仂仍亠亶, 仂 仂 亟仂弍仆仂 亟亠仍舒 于 My::DB::MlPerson. 亳仄亠仂仄 磦仍磳 仍舒亶, 从仂亞亟舒 于舒 于 仗仂仍亠 舒仆亳 亠亳舒仍亳亰仂于舒仆仆舒 从舒 亟舒仆仆. 弌从舒亢亠仄, 亠亳舒仍亳亰仂于舒仆仆舒 亠亠亰 Storable. 亳仄亠 亟仍 舒从仂亞仂 仗仂仍 stor_field: package My::DB::MlPerson; . use Storable qw(thaw freeze); $Storable::interwork_56_64bit = 1; sub alias_to_stor_field{ my ($row_obj,$new_val) = @_; if ($new_val and ref $new_val) { # 舒于亳仄 仆仂于仂亠 亰仆舒亠仆亳亠 $row_obj->stor_field(freeze($new_val)); return 1; } elsif ($row_obj->stor_field) { # 亟亠亠亳舒仍亳亰亠仄 亳仄亠ム亠亠 return thaw($row_obj->stor_field); } ; return undef; }
  • 7. 仂 于仂 从仂亞亟舒 仆舒仄 亠弍亠 仂弍舒弍仂舒 仆舒弍仂 仂从, 于仗舒亠 于 于仂 亳仍 My::DB::MlPerson::Manager. 舒仄仂仄 仄仂亟仍亠 于 于亳亟亳亠: __PACKAGE__->make_manager_methods(' 舒亰于舒仆亳亠丐舒弍仍亳舒亰亠 '); 亅仂 仄亠仂亟 亟亠仍舒亠 亟仂仗仆仄亳 仍亠亟ム亳亠 仄亠仂亟 亟仍 从仍舒舒 My::DB::MlPerson::Manager: get_舒亰于舒仆亳亠丐舒弍 仍 亳舒亰亠 get_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠_iterator get_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠_count delete_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠 update_舒亰于舒仆亳亠丐舒弍仍亳舒亰亠 舒从 , 亟仍 仆舒亠亶 舒弍仍亳 ml_person , 仂 弍亟: My::DB::MlPerson::Manager->get_ml_person 于仂亰于舒舒亠 仍从 仆舒 仄舒亳于 于亠 仂从 于 舒弍仍亳亠 (仂 亟仂弍仆仂 于 仂亠仆 亠亟从亳 仍舒, 从仂亞亟舒 仂弍舒舒亠 仗仂 亳仆亟亠从, 舒 仆亠 舒亰仄亠仆仂于于舒亠 仄舒亳于. , 于 舒于仆仂, 仆亠 亟仂弍仆仂.) My::DB::MlPerson::Manager->get_ml_person_iterator 于仂亰于舒舒亠 亳亠舒仂 亟仍 仂弍仂亟舒 于亠亶 舒弍仍亳. my $i = My::DB::MlPerson::Manager->get_ml_person_iterator; while( my $p = $i->next ) { print $p->name; $i-> finish if(...); } 仆亞 仆舒 仍亳仂. 于 弍仍仂 弍 仂于亠仄 仗仍仂仂,
  • 8. 亳 仄亠仂亟 仄亠ム 仗亳仆亳仄舒 舒亞仄亠仆 亟仍 仂仆亠仆亳 亠亰仍舒仂于 仗仂亳从舒 亳 于仂亰于舒舒 仂仂于亠于ム亠亶 仍从亳 仆舒 仄舒亳于 亳仍亳 亳亠舒仂: my $i = My::DB::MlPerson::Manager->get_ml_person_iterator( query => [ name => {like => '%Hat'}, person_id => {ge => 7}, or => [ age => 15, age => {lt => 10}, ], ], sort_by => 'name', limit => 10, offset => 50 ); while( my $p = $i->next ) { print $p->name; $i-> finish if(...); } 亅亳 舒亞仄亠仆 从于亳于舒仍亠仆仆 从于亠亠: SELECT person_id, name, age,,password FROM ml_person WHERE name LIKE '%Hat' AND person_id >= 7 AND (age = 15 OR age < 10.00) ORDER BY name LIMIT 10 OFFSET 50
  • 9. 舒仍亠亠 , My::DB::MlPerson::Manager->get_ml_person_count 于仂亰于舒舒亠 亳仍仂 亰舒仗亳亠亶 于 舒弍仍亳亠. 丐舒从 亢亠 仄亠亠 仗亳仆亳仄舒 舒亞仄亠仆, 仂弍 从仂仆从亠亳亰亳仂于舒 where 于 亰舒仗仂亠 仆舒 仗仂亟. My::DB::MlPerson::Manager->delete_ml_person 亟舒仍磳 亰舒仗亳亳 于 仂仂于亠于亳亳 仗亠亠亟舒仆仆仄亳 舒亞仄亠仆舒仄亳. My::DB::MlPerson::Manager->update_ml_person 仂弍仆仂于仍磳 亰舒仗亳亳 于 仂仂于亠于亳亳 仗亠亠亟舒仆仆仄亳 舒亞仄亠仆舒仄亳. 亟亠 仂亳 仂仄亠亳, 从舒从 仗亠亠亟舒 舒亞仄亠仆 set 于 从于亠: My::DB::MlPerson::Manager->update_ml_person( set => { age => 25, }, where => [ age => 24, person_id => { gt => 100 }, ] ) ; 仍ミ頴笑 亳亰 从仍舒仂于-仂仗亳舒仆亳亶 舒弍仍亳, 于 仄仂亢亠亠 于弍舒 亳仍 仗仂亟从仍ム亠仆亳, 亠仍亳 仗亠亠亞亰亳亠 仄亠仂亟: 弌仂弍于亠仆仆仂亠 仗仂亟从仍ム亠仆亳亠 从 弍舒亰亠: sub init _ db { My :: DB -> new } 仗仂仍亰仂于舒 亢亠 仂亰亟舒仆仆仂亠 亳仍亳 仆仂于仂亠: sub init _ db { My :: DB -> new _ or _ cached }
  • 10. 于亠亞亟舒 仄仂亢亠亠 仗仂仍亳 仂弍亠从 My :: DB $p = My::DB::MlPerson->new(...); $db = $p->db; , 仂亞舒仆亳亰仂于舒 舒仆亰舒从亳仂仆仆亶 仄亠舒仆亳亰仄 (亠仍亳 舒于仂从仂仄仄亳 仂从仍ム亠仆): $p = My::DB::MlPerson->new(...); $db = $p->db; $db->begin_work; # 舒舒仍仂 舒仆亰舒从亳亳 # 仗仂仍亰亠仄 仆舒 $db 亟仍 从舒亢亟仂亞仂 仂亰亟舒于舒亠仄仂亞仂 仂弍亠从舒-仂从亳 $p1 = My::DB::MlPerson->new(name => 'Bike', db => $db); $p1->save; $p2 = My::DB::MlPerson ->new(name => 'Sled', db => $db); $p2->save; $p3 = My::DB::MlPerson->new(name => 'Kite', db => $db); $p3->save; if(...) # 亳仄亠仆磳仄 亳亰仄亠仆亠仆亳 亳仍亳 仂从舒于舒亠仄 { $db->commit; } else { $db->rollback; } ; 亠仗亠 于亠仆仄 从 My :: DB 亳 于仂亰仄仂亢仆仂亳 亠亞亳亳仂于舒 仆亠从仂仍从仂 从仂仆仆亠从仂于 从 弍舒亰舒仄, 亳亞舒 仗舒舒仄亠舒仄亳 type 亳 domain .
  • 11. 仆舒 弍亟 仂仗亳舒仆 于 My :: DB 亟于舒 从仂仆仆亠从舒 亟仍 弍舒亰 仂亟亳仆舒从仂于仄亳 从舒仄亳. 亟仆舒 domain => production 亳 于仂舒 domain => archive . 舒亰仆舒亠仆亳亠 弍舒亰 仗仂仆仆仂. $production_db = My::DB->new('production'); $archive_db = My::DB->new('archive'); # 舒亞亰亳仄 仗仂亟舒从仆 弍舒亰 亟舒仆仆亠 仗仂 从仂仆从亠仆仂亶 仗亠仂仆亠 $p = My::DB::MlPerson->new(person_id => 'John', db => $production_db); $p->load; # 弌从仂仗亳亠仄 亟舒仆仆亠 仗仂 仗亠仂仆亠 于 舒亳于 $p->db($archive_db); $p->save(insert => 1); # 舒亞仄亠仆 insert 仗仂亰于仂仍亳 仍亳弍仂 亰舒仗亳舒 仂从, 仍亳弍仂 仂弍仆仂于亳 亰仆舒亠仆亳 # 丕亟舒仍亳仄 仂弍仂亰仆舒亠仆仆 仗亠仂仆 亳亰 仗仂亟舒从仆 弍舒亰 $p->db($production_db); $p->delete; 舒仄仂亳仄 亰舒于亳亳仄仂亳. 仍亳 于舒 于 弍舒亰亠 仂仆亳 仆亠 弍仍亳 仗仂舒于仍亠仆, 仂 仗亳 亞亠仆亠舒亳亳 从仍舒仂于-舒弍仍亳, 于 亳 仂 亢亠 仆亠 于亳亟亳亠. 亠仍亠 于 仂仄, 仂 仄仂亢仆仂 仗仂仗亳舒 亳 从舒仄亳.
  • 12. 亠亟舒从亳亠仄 My::DB::MlPerson 亳 亟仂弍舒于亳仄 于 仄亠仂亟 setup 于仂 舒从仂亶 舒亞仄亠: foreign_keys => [ crm => { class => 'My::DB::CrmBridge', key_columns => { person_id => 'f_person_id' }, relationship_type => 'one to one', }, ] 舒从, 仂 仆舒 亰亟亠: 仂亰亟舒仆舒 于磶 仄亠亢亟 从仍舒舒仄亳 (仆亠 舒弍仍亳舒仄亳): My::DB::MlPerson 亳 My::DB::CrmBridge. 仍亠亟ム亳仄 仂弍舒亰仂仄: ml _ person . person _ id 磦仍磳 于仆亠仆亳仄 从仍ム仂仄 亟仍 crm _ bridge . f _ person _ id . 弌仂仂于亠于亳亠 仂仗亠亟亠仍亠仆仂 从舒从 仂亟亳仆-从-仂亟仆仂仄. 弍舒亠仆亳亠 从 仂仆仂亠仆亳 亳亟 仗仂 仄亠仂亟 亳仄亠仆亠仄 crm . relationship _ type 仄仂亢亠 舒从 亢亠 弍 亰舒仗亳舒仆 从舒从 rel _ type (亳仆仂仆亳仄) , 亠仗亠 仄 仄仂亢亠仄 亟亠仍舒 于仂 舒从 从: $ p = My :: DB :: MlPerson->new(person_id=>74952020)->load; $p->crm->any_field 亞亟亠, any_field - 仂 仍ミ頴笑 仗仂仍亠 亳亰 舒弍仍亳 crm _ bridge .
  • 13. 仂弍亠仄-仂, 于 亟舒仆仆仂仄 仍舒亠 仄仂亢仆仂 弍仍仂 弍 亳 仂仗亳 rel _ type . 舒 亳 从 仂仄 亢亠, 仄仂亢亠仆仂 于仂仂弍亠 于仆亠亳 仂 舒亞仄亠仆 于 于亳亟亠 于亰仂于舒 仄亠仂亟舒 (仆仂 仂 于舒亢仆仂, 仂弍 仂 弍仍仂 仂仗亠亟亠仍亠仆仂 亟仂 于亰仂于舒 setup ): package My::DB::MlPerson; __PACKAGE__->meta->foreign_keys( 'crm' => { class => 'My::DB::CrmBridge', key_columns => { person_id => 'f_person_id' } } ); __PACKAGE__->meta->setup( ) 于仂, 亳仆亠亠仆亶 仍舒亶 从仂亞亟舒 仗亠仂仆舒 于仂亟亳 于 仆亠从仂仍从仂 亞仗仗 (于 仂仄 亢亠 从仍舒亠 My::DB::MlPerson 亟仂 setup ): __PACKAGE__->meta->relationships ( group => { type => 'one to many', class => 'My::DB::MlGroup', column_map => { person_id => 'f_person_id' }, }, ); 亟亠 仂弍仂亰仆舒亠仆仂 仂仆仂亠仆亳亠 仂亟亳仆-从仂-仄仆仂亞亳仄 (仂亟仆舒 仗亠仂仆舒 亳亰 ml _ persons 仄仂亢亠 亳仄亠 仆亠从仂仍从仂 亰舒仗亳亠亶 于 ml _ group ). 舒从 亢亠 仗仂仆仆仂, 仄仂亢仆仂 仂弍仂亰仆舒亳 仂 仂仆仂亠仆亳亠 亳 于 于亳亟亠 舒亞仄亠仆舒 于 仄亠仂亟亠 setup , 亠仍亳 于舒仄 舒从 亟仂弍仆亠亠.
  • 14. 丼仂 舒亰 仆亠 仗仂仆舒于亳仍仂 : $p = My::DB::MlPerson->new(person_id=>74952020)->load; $bor = $p->group; ref $bor eq 'ARRAY'; 亟亞亳仄亳 仍仂于舒仄亳 仗亳 仂弍舒亠仆亳亳 从 仂仆仂亠仆亳, 于 仗仂仍舒亠亠 仍从 仆舒 仄舒亳于 亳仍亳 仄舒亳于 (于 亰舒于亳亳仄仂亳 仂 从仂仆亠从舒). 舒 仍亳仂 磦仆舒 亳亰弍仂仆仂. 仂 亟仂从仄亠仆舒亳亳 仆亠 仆舒仍, 从舒从 仗仂仍亳 于仂亰仄仂亢仆仂 仂弍舒亳 从 仂仆仂亠仆亳 于仂亰仄仂亢仆仂 仂仆亠仆亳 亰舒仗仂舒 (亳仗舒 于弍舒 仂仍从仂 从仂仆从亠仆亠 亞仗仗 亟仍 仗亠仂仆) 弍亠亰 于亞亠弍舒仆亳 于亠 亰舒仗亳亠亶 亳亰 ml _ group . 亢 亠仄 弍仂仍亠亠, 于 仗仂亟舒从仆 于亠亞亟舒 亳仆亠亠仆亠亠 仗仂仍亳 亳亠舒仂, 舒 #@ ! , 弍仂仍亠亠 仂亞仂, 仗仂 亟亠仂仍 (舒 仂 仂亠于亳亟仆仂 仆舒舒亳于舒亠), 仗仂于仂仆仂亠 仂弍舒亠仆亳亠: $p->group; 亢亠 仆亠 舒仍仂 仍亠亰 于 弍舒亰 (舒 于亠亟 仂 仂仂仆 从仂-仂 仄仂亞 仗仂仄亠仆 亰仆舒亠仆亳亠 于 仂从舒 舒弍仍亳), 舒 仗仂仂 仂亟舒仍仂 亰仆舒亠仆亳亠 亳亰 亠舒 (!). 仂弍亠仄, 于 亟舒仆仆仂仄 于仂仗仂亠, 亳仄仂, 仍亳 DBIx :: Class . 丼仂 仄仂亢仆仂 仆舒亰于舒 亟仂弍仆仄, 舒从 仂 亟舒仍亠仆亳亠 亞仗仗, 于 从仂仂 仂仂亳 仗亠仂仆舒: $p = My::DB::MlPerson->new(person_id=>74952020)->load; $p-> group([ ]); $p->save; 于仂 仗亳仄亠 仂舒仍仆仂 亟舒仍亠仆亳 于亠 于磶舒仆仆 仂从: $p->delete(cascade => 1); 仍 亞仍弍仍亠仆亳 于仂仗仂舒 仗仂 仂仄 从舒从 仂舒于仍 从于亠亳, 亠从仂仄亠仆亟 仗仂仄仂亠 Rose::DB::Object::Manager, 亞亟亠 从 仂亢舒仍亠仆亳 仆亠 仆舒仍 仗亳仄亠舒 仗仂 于亰仂于 舒仆亳仄仂从. 丐亠仄 亳亠从 亳舒 仆亠 舒从仂亶, 仆仂 亟仍 弍仂亞仂 舒舒 于仗仂仍仆亠 亟仂舒仂仆仂.