2009-02-04 6 views
6

कक्षा के साथ एक डालने ऐसा करने के लिए :: DBI, तो आप बस कर सकते हैं:मैं क्लास :: डीबीआई में पहले रिकॉर्ड का चयन किए बिना अपडेट कैसे कर सकता हूं?

my $object = Object::DB->insert({ a => 1, b => 2, c => 3, ...}); 

लेकिन वहाँ अद्यतन के लिए ऐसी कोई बात नहीं है। सबसे अच्छा के साथ मैं पहले रिकॉर्ड को चुन रही है तो यह अद्यतन करने आ सकता है:

my $object = Object::DB->retrieve($id); 
my $object->set(a => 1, b => 2, c => 3, ...}; 
$object->update; 

इस के बाद से मैं सिर्फ एक अद्यतन के बजाय एक अद्यतन पहले एक का चयन करना है, और फिर कुशल नहीं है।

कक्षा :: डीबीआई के साथ ऐसा करने का कोई बेहतर तरीका है? मैं 42 $ ऑब्जेक्ट नहीं करना चाहता-> एक (1), $ ऑब्जेक्ट-> बी (2), आदि, $ ऑब्जेक्ट-> अपडेट;

+0

डीबीआईएक्स :: कक्षा यह आसान बनाता है। आपको वास्तव में सीडीबीआई से दूर जाने पर विचार करना चाहिए। – jrockway

उत्तर

6

जहां तक ​​मुझे पता है, कक्षा :: डीबीआई के पास ऐसा करने का कोई अच्छा तरीका नहीं है, जैसा कि आपने देखा है, इसकी update() विधि किसी ऑब्जेक्ट पर कॉल की जानी है जिसे पहले डेटाबेस से लोड किया गया था।

आप कक्षा :: DBI को समझाने के लिए आप क्या चाहते हैं ऐसा करने के लिए, हालांकि, कुछ इस तरह से सक्षम हो सकता है:

# Make new "empty" object 
my $o = My::CDBI::Object->new; 

# Set the primary key column and discard the change 
$o->set(your_pk_column => 123); 
$o->discard_changes; 

# Set your other columns 
$o->set(a => 'foo', b => 'bar'); 

# Do the update 
$o->update; 

यदि यह सुविधा आपके लिए महत्वपूर्ण है और आप पहले से ही बहुत दूर में नहीं कर रहे हैं आपकी परियोजना, आपको Rose::DB::Object या DBIx::Class जैसे नए पर्ल ओआरएम में से एक के साथ निश्चित रूप से बेहतर भाग्य होगा। डीबीआईएक्स :: कक्षा में a Class::DBI compatibility layer भी शामिल है।

4

एक ऐसा तरीका जो मैंने पाया है, वह आपकी ऑब्जेक्ट्स के लिए डिफ़ॉल्ट इटरेटर वर्ग को ओवरराइड करना है। यह आपको संग्रह पर अद्यतन विधि के साथ व्यक्तिगत वस्तुओं का संग्रह करने की अनुमति देता है। कक्षा :: DBI इस के लिए एक तरीका प्रदान करता है:

__PACKAGE__->iterator_class('MyClass::CDBI::Iterator'); 

यह अनुमति देता है आप तो इटरेटर कक्षा में एक update विधि है कि संग्रह में वस्तुओं के सभी को बचा सकता है बनाने के लिए। जैसे आपका कोड इस तरह कुछ दिख सकता है:

my $collection = Object::DB->search_where({id => {'>=', 0}}); 
foreach my $obj ($collection->next()) { 
    $obj->a('bob'); 
    $obj->b('tom'); 
} 
$collection->update(); 

जो कुछ सुंदर स्व-दस्तावेज कोड बनाता है। यदि आप इस मार्ग पर जाते हैं, तो मैं अपडेट() होने के कारण is_changed विधि को उपयोग में रखने का सुझाव भी दूंगा। यह अपरिवर्तित पंक्तियों को अपडेट न करके आपको समय बचाने में मदद करेगा।

संबंधित मुद्दे

 संबंधित मुद्दे