2010-02-18 8 views
6

Có vẻ như một nỗi đau khi có các lớp học Moose của tôi. Sau đó, sử dụng DBIx::Class để có được kết quả được đặt .. sau đó ánh xạ thủ công kết quả của tôi được đặt thành các lớp học nai sừng tấm.Có cách nào dễ dàng để ánh xạ DBIx :: Kết quả lớp cho các lớp Moose tùy chỉnh của tôi không?

+1

Tại sao bạn ánh xạ kết quả đến các lớp học Moose? Tại sao không sử dụng các lớp DBIx :: Class trực tiếp? – friedo

Trả lời

3

Bạn có thể sử dụng Moose với DBIC không thành vấn đề. Thực ra tôi thích sử dụng MooseX :: Khai báo vì tôi thấy cú pháp mở rộng rất hữu ích khi thiết kế apis công khai vững chắc, ví dụ:

use MooseX::Declare; 
class MyApp::Schema::Result::Geo::Division 
extends MyApp::Schema::Result { 
    use Locale::Geocode::Division; 
__PACKAGE__->table('division'); 
__PACKAGE__->add_columns(
    fk_territory_id => { 
    data_type => 'char', 
    size => '36', 
    }, 
    division_id => { 
    data_type => 'char', 
    size => '36', 
    }, 
    code => { 
      data_type => 'varchar', 
    size => '5', 
    }, 
    created => { 
    data_type => 'datetime', 
    set_on_create => 1, 
    }, 
); 

__PACKAGE__->set_primary_key('fk_territory_id','division_id'); 
__PACKAGE__->uuid_columns('division_id'); 
    __PACKAGE__->add_unique_constraint(['fk_territory_id','code']); 

__PACKAGE__->belongs_to(
    territory => 'MyApp::Schema::Result::Geo::Territory', 
    {'foreign.territory_id' => 'self.fk_territory_id'}, 
); 
    method as_geocode_division { 
     Locale::Geocode::Division->new($self->code); 
    }  
__PACKAGE__->meta->make_immutable(inline_constructor => 0); 
} 1; 
+0

Làm thế nào bạn khai báo các thuộc tính Moose nếu lược đồ đã được xác định bởi DB (nghĩa là, DBIx :: Lớp đọc trong lược đồ, thay vì nó được định nghĩa bằng phương thức gọi bạn làm ở trên)? – Ether

+0

Bạn có nghĩa là tải * giản đồ * runtime? Không chơi đẹp đâu. :) – hobbs

1

Có vẻ như bạn đang mô tả chính xác những gì tôi đã viết gần đây để lập bản đồ Moose các giá trị thuộc tính lên các giá trị Rose::DB::Object (với đối tượng db và đối tượng được chứa trong các thuộc tính riêng) và ngược lại. Ban đầu tôi đã sử dụng các trigger xung quanh mỗi thuộc tính Moose để ghi vào đối tượng Rose ngay lập tức, nhưng sau đó đã bỏ qua cách tiếp cận đó và chỉ viết các giá trị khi cần (tức là tại thời điểm hoạt động ->save()). Tôi đã thực hiện nó bằng cách sử dụng một vài vai trò và một lớp đường đã tự động cài đặt một đặc điểm thuộc tính cho biết "Tôi là một trường bảng" cho các thuộc tính có liên quan.

Nhưng đừng làm những gì tôi đã làm - chỉ cần sử dụng trực tiếp DBIx::Class! Các phiên bản lớn tiếp theo đang được viết lại trong Moose anyway, vì vậy tôi nghe.

+0

* Các phiên bản chính tiếp theo đang được viết lại trong Moose anyway, vì vậy tôi nghe. * Đó là đi xung quanh trong nhiều năm. –

+1

Matt đã có một cuộc nói chuyện sáng tạo về nó tại Perl Oasis tháng trước. – perigrin

6

Nếu bạn đang phải ánh xạ qua lại giữa các lớp Moose và lược đồ DBIC, bạn có thể muốn xem xét một kho lưu trữ đối tượng liên tục như KiokuDB thay thế.

Bạn mất một số tính năng của cơ sở dữ liệu quan hệ, đặc biệt nếu bạn có lược đồ hiện có nhưng bạn có nhiều tính năng chính là ánh xạ yên tĩnh giữa lưu trữ dữ liệu và mô hình đối tượng của bạn. DBI back-end cho KiokuDB có lẽ là ví dụ tốt nhất của việc giao dịch này. Cơ sở dữ liệu được khử chuẩn hóa cao, nhưng đó là vì nó hoạt động hiệu quả như một kho khóa.

Tuy nhiên, KiokuDB có thể hoạt động với các công cụ lưu trữ được tối ưu hóa cho loại dữ liệu này. Nó hỗ trợ một số cây trồng hiện tại của "NoSQL" người nổi tiếng bao gồm CouchDB, và MongoDB. Nó cũng hỗ trợ các fan hâm mộ cũ yêu thích BerkelyDB.

Kioku không phải là câu trả lời cho mọi sự cố, nhưng nó được sử dụng khá thành công cho Parking Mobility để xử lý tất cả lưu trữ dữ liệu liền mạch.

+0

+1 để đánh bại tôi khi đề cập đến KiokuDB. –