Khi nào tôi nên sử dụng DBIx :: Class của Perl?


17

DBIx :: Class là giao diện Perl phổ biến cho bất kỳ cơ sở dữ liệu nào mà bạn có thể kết nối thông qua DBI . Có tài liệu tốt cho các chi tiết kỹ thuật của nó, nhưng thông tin ít ỏi về việc sử dụng đúng cách của nó (bao gồm cả các tình huống mà bạn có thể không muốn nó).

Trong nhiều tình huống, mọi người tiếp cận nó theo phản xạ vì họ nghĩ rằng họ nên sử dụng nó cho mọi thứ liên quan đến cơ sở dữ liệu. Tuy nhiên, tôi thường thấy nó bị lạm dụng đến mức trở thành một điểm đau. Câu hỏi của tôi trong quá trình đánh giá mã và kiến ​​trúc luôn là "Foo mang lại lợi ích gì cho bạn?" Thông thường, các nhà phát triển tôi thấy trong các tình huống này không thể tạo thành một câu trả lời mạch lạc cho điều đó. Nhưng sau đó, họ cũng thường không hiểu SQL đơn giản.

Trong vài tháng qua tôi đã hỏi mọi người "Tại sao bạn sử dụng DBIx :: Class?" và chỉ nhận được một câu trả lời hay (và người đó cũng có thể trả lời tiếp theo "Khi nào bạn không sử dụng nó"). Peter Rabbitson, nhà phát triển chính, đã có được một câu trả lời trong cuộc phỏng vấn của mình trên FLOSS Weekly , nhưng nó hơi bị chôn vùi giữa cuộc phỏng vấn.

Vậy, làm thế nào tôi có thể quyết định xem sử dụng DBIx :: Class có phù hợp với dự án không?


3
Bạn đang viết một cuốn sách khác? :)
simbabque

1
Theo kinh nghiệm của tôi, nỗi đau xuất hiện khi DBIC được sử dụng trong các tình huống quá mức cần thiết. Và, mặc dù rất mạnh mẽ, nó thường quá mức cần thiết bởi vì mọi người chỉ sử dụng các tính năng cơ bản (tạo và tham gia SQL) và không cần bất cứ điều gì khác. Đó là lý do tại sao tôi đã viết DBIx :: Lite, cung cấp các tính năng cơ bản đó và không yêu cầu bất kỳ lược đồ nào phải được mã hóa cứng.
Alessandro

Câu trả lời:


24

Trước khi tôi trả lời câu hỏi, tôi nghĩ rằng một số nền tảng là theo thứ tự.

Cốt lõi của vấn đề

Sau nhiều năm phỏng vấn và tuyển dụng các nhà phát triển, tôi đã học được hai điều:

  1. Phần lớn các nhà phát triển có rất ít kinh nghiệm trong thiết kế cơ sở dữ liệu.

  2. Tôi đã nhận thấy mối tương quan lỏng lẻo giữa những người không hiểu cơ sở dữ liệu và những người ghét ORM.

(Lưu ý: và vâng, tôi biết có những người hiểu rất rõ về cơ sở dữ liệu, những người ghét ORM)

Khi người ta không hiểu tại sao các phím nước ngoài là quan trọng, tại sao bạn không nhúng các tên nhà sản xuất trong itembảng, hoặc lý do tại sao customer.address1, customer.address2customer.address3các lĩnh vực không phải là một ý tưởng tốt, thêm một ORM để làm cho nó dễ dàng hơn cho họ để lỗi cơ sở dữ liệu ghi sẽ không giúp được gì cả.

Thay vào đó, với cơ sở dữ liệu được thiết kế đúng và trường hợp sử dụng OLTP, ORM là vàng. Hầu hết các công việc khó khăn đều biến mất và với các công cụ như DBIx :: Class :: Schema :: Loader , tôi có thể chuyển từ một lược đồ cơ sở dữ liệu tốt sang làm việc với mã Perl trong vài phút. Tôi xin trích dẫn Quy tắc Pareto và nói rằng 80% các vấn đề của tôi đã được giải quyết với 20% công việc, nhưng thực tế, tôi thấy lợi ích còn lớn hơn thế.

Lạm dụng giải pháp

Một lý do khác khiến một số người ghét ORM là vì họ sẽ để sự trừu tượng bị rò rỉ. Hãy xem xét trường hợp phổ biến của các ứng dụng web MVC. Đây là một cái gì đó chúng ta thường thấy (mã giả):

GET '/countries/offices/$company' => sub {
    my ( $app, $company_slug ) = @_;
    my $company = $app->model('Company')->find({ slug => $company_slug }) 
      or $app->redirect('/');
    my $countries = $app->model('Countries')->search(
     {
         'company.company_id' => $company->company_id,
     },
     {
         join     => [ offices => 'company' ],
         order_by => 'me.name',
     },
   );
   $app->stash({
     company   => $company,
     countries => $country,
   });
}

Mọi người viết các tuyến điều khiển như thế và vỗ nhẹ vào lưng, nghĩ rằng đó là mã sạch, tốt. Họ sẽ kinh ngạc với SQL mã hóa cứng trong bộ điều khiển của mình, nhưng họ đã làm ít hơn là phơi bày một cú pháp SQL khác. Mã ORM của họ cần được đẩy xuống thành một mô hình và sau đó họ có thể làm điều này:

GET '/countries/offices/$company' => sub {
   my ( $app, $company_slug ) = @_;
   my $result = $app->model('Company')->countries($company_slug)
     or $app->redirect('/');
   $app->stash({ result => $result });
}

Bạn biết những gì đã xảy ra bây giờ? Bạn đã đóng gói đúng mô hình của mình, bạn đã không hiển thị ORM và sau đó, khi bạn thấy rằng bạn có thể tìm nạp dữ liệu đó từ bộ đệm thay vì cơ sở dữ liệu, bạn không cần thay đổi mã điều khiển của mình (và nó dễ dàng hơn để viết các bài kiểm tra cho nó và sử dụng lại logic).

Trong thực tế, điều xảy ra là mọi người rò rỉ mã ORM của họ trên tất cả các bộ điều khiển (và chế độ xem) của họ và khi họ gặp phải các vấn đề về khả năng mở rộng, họ bắt đầu đổ lỗi cho ORM thay vì kiến ​​trúc của họ. ORM có một bản rap tệ (tôi thấy điều này lặp đi lặp lại cho nhiều khách hàng). Thay vào đó, hãy ẩn sự trừu tượng đó để khi bạn thực sự đạt giới hạn ORM, bạn có thể chọn giải pháp phù hợp cho vấn đề của mình thay vì để mã được liên kết chặt chẽ với ORM mà bạn bị ràng buộc.

Báo cáo và các hạn chế khác

Như Rob Kinyon đã nói rõ ở trên, báo cáo có xu hướng là một điểm yếu trong ORM. Đây là một tập hợp con của một vấn đề lớn hơn khi SQL hoặc SQL phức tạp kéo dài nhiều bảng đôi khi không hoạt động tốt với ORM. Ví dụ: đôi khi ORM buộc loại tham gia mà tôi không muốn và tôi không thể biết cách khắc phục điều đó. Hoặc có thể tôi muốn sử dụng một gợi ý chỉ mục trong MySQL, nhưng nó không dễ dàng . Hoặc đôi khi SQL quá phức tạp đến nỗi việc viết SQL sẽ tốt hơn thay vì sự trừu tượng được cung cấp.

Đây là một phần lý do tôi bắt đầu viết DBIx :: Class :: Báo cáo . Cho đến nay nó hoạt động tốt và giải quyết được phần lớn các vấn đề mà mọi người gặp phải ở đây (miễn là chúng ổn với giao diện chỉ đọc). Và trong khi nó có vẻ giống như một cái nạng, trong thực tế, miễn là bạn không bị rò rỉ sự trừu tượng của mình (như đã giải thích trong phần trước), nó làm cho việc làm việc DBIx::Classtrở nên dễ dàng hơn.

Vậy khi nào tôi sẽ chọn DBIx :: Class?

Đối với tôi, tôi sẽ chọn nó hầu hết các lần tôi cần một giao diện cho cơ sở dữ liệu. Tôi đã sử dụng nó trong nhiều năm. Tuy nhiên, tôi có thể không chọn nó cho hệ thống OLAP và các lập trình viên mới hơn chắc chắn sẽ phải vật lộn với nó. Ngoài ra, tôi thường thấy tôi cần lập trình meta và trong khi DBIx::Classcung cấp các công cụ, chúng rất kém.

Chìa khóa để sử dụng DBIx::Classchính xác giống như đối với hầu hết các ORM:

  1. Đừng rò rỉ sự trừu tượng.

  2. Viết bài kiểm tra chết tiệt của bạn.

  3. Biết cách thả xuống SQL, khi cần.

  4. Tìm hiểu làm thế nào để bình thường hóa một cơ sở dữ liệu.

DBIx::Class, một khi bạn học nó, sẽ chăm sóc hầu hết các công việc nặng nhọc của bạn cho bạn và làm cho nó dễ dàng để nhanh chóng viết các ứng dụng.


1
Có lẽ bạn có thể thêm một danh sách khác khi bạn không sử dụng nó. :)
brian d foy

1
Điều này là rõ ràng đối với bạn, nhưng có lẽ không rõ ràng đối với nhiều độc giả (tôi nói, đã dành nhiều năm #dbix-class#catalyst) - chìa khóa cho bit "không rò rỉ trừu tượng" là mọi điều bạn đang làm việc trong DBIC là một lớp con của một cái gì đó cung cấp hành vi cắt cookie. Bạn được khuyến khích thêm các phương thức vào các lớp con của mình và trừ khi bạn đang thực hiện công việc Hỏi & Đáp, chỉ các phương thức bạn đã viết nên là một phần của giao diện công khai.
hobbs 9/12/2015

@hobbs: Thật vậy, đó là nơi tôi thấy mọi người đi sai nhất với điều này và đó là cách họ bị mắc kẹt với DBIC. Chúng ta thường cho rằng mọi người biết những gì họ đang làm trong nhỏ, nhưng tìm ra trong lớn họ không làm.
brian d foy

9

Để biết khi nào nên sử dụng một cái gì đó, điều quan trọng là phải hiểu mục đích của nó là gì. Mục tiêu của sản phẩm là gì.

DBIx :: Class là một ORM - Mapper Relative Relative. Một ORM lấy cấu trúc dữ liệu cơ sở dữ liệu quan hệ dựa trên quan hệ / tập hợp và ánh xạ nó tới cây Object. Ánh xạ truyền thống là một đối tượng trên mỗi hàng, sử dụng cấu trúc của bảng làm mô tả lớp. Mối quan hệ cha-con trong cơ sở dữ liệu được coi là mối quan hệ ngăn chặn giữa các đối tượng.

Đó là xương của nó. Nhưng, điều đó không giúp bạn quyết định xem bạn có nên sử dụng ORM hay không. Các ORM chủ yếu hữu ích khi các điều sau là đúng:

  • Bạn sử dụng một cơ sở dữ liệu quan hệ.
  • Dữ liệu của bạn chủ yếu được sử dụng cho OLTP (Xử lý giao dịch trực tuyến).
  • Bạn không viết báo cáo trong ứng dụng của bạn.

Sức mạnh lớn nhất mà ORM có được là xây dựng SQL tốt để đi theo biểu đồ cây được phủ lên trên cấu trúc dữ liệu quan hệ. SQL thường có nhiều lông và phức tạp, nhưng đó là cái giá của việc quản lý sự không phù hợp trở kháng.

Mặc dù các ORM rất giỏi trong việc viết SQL trích xuất hàng, nhưng chúng rất kém trong việc viết SQL đối chiếu. Đây là loại SQL mà các báo cáo được xây dựng trên. Kiểu đối chiếu này được xây dựng bằng các công cụ khác nhau, không phải ORM.

Có nhiều ORM trong các ngôn ngữ khác nhau, một số trong Perl. Các ánh xạ khác là Class :: DBI và Rose :: DB. DBIx :: Class thường được coi là tốt hơn so với các loại khác phần lớn dựa trên sức mạnh của các kết quả của nó. Đây là một khái niệm trong đó việc tạo SQL được tách ra khỏi thực thi SQL.


Cập nhật : Để đáp ứng với Ovid, DBIx :: Class (thông qua SQL :: Tóm tắt) cung cấp khả năng chỉ định cả hai cột nào sẽ trả về cũng như gợi ý sử dụng chỉ mục nào.

Tuy nhiên, nói chung, nếu bạn muốn làm điều này, thì tốt hơn hết là bạn không nên sử dụng ORM cho truy vấn cụ thể đó. Hãy nhớ rằng - mục đích chính của ORM là ánh xạ các hàng trong bảng tới các đối tượng của một lớp có thuộc tính là các cột của bảng. Nếu bạn chỉ điền một số thuộc tính, thì người dùng tiềm năng của đối tượng đó sẽ không biết thuộc tính nào được điền hay không. Điều này dẫn đến lập trình phòng thủ khủng khiếp và / hoặc sự căm ghét chung của các ORM.

Hầu như luôn luôn, mong muốn sử dụng gợi ý chỉ mục hoặc giới hạn cột nào được trả về là tối ưu hóa cho tốc độ và / hoặc truy vấn tổng hợp.

  • Các truy vấn tổng hợp là các ORM trường hợp sử dụng KHÔNG được thiết kế cho. Trong khi DBIx :: Class có thể tạo các truy vấn tổng hợp, bạn không tạo biểu đồ đối tượng, vì vậy chỉ cần sử dụng DBI trực tiếp.
  • Tối ưu hóa hiệu suất được sử dụng vì dữ liệu được truy vấn quá lớn đối với cơ sở dữ liệu cơ bản, bất kể bạn truy cập nó như thế nào. Hầu hết các cơ sở dữ liệu quan hệ là lý tưởng cho các bảng có tối đa 1-3MM hàng SSD chạy trong đó hầu hết các chỉ số + chỉ số phù hợp với RAM. Nếu tình huống của bạn lớn hơn thế này, thì mọi cơ sở dữ liệu quan hệ sẽ có vấn đề.

Có, một DBA tuyệt vời có thể tạo các bảng có chức năng hàng 100MM + trong Oracle hoặc SQL * Server. Nếu bạn đang đọc điều này, bạn không có một nhân viên DBA tuyệt vời.

Tất cả những điều này đã nói, một ORM tốt không chỉ tạo ra các biểu đồ đối tượng - nó còn cung cấp một định nghĩa nội tâm của cơ sở dữ liệu của bạn. Bạn có thể sử dụng điều này để giúp tạo các truy vấn đặc biệt và sử dụng chúng như với DBI mà không cần tạo biểu đồ đối tượng.


Tôi nghĩ rằng hầu hết mọi thứ tôi thấy đều viết báo cáo, đó có lẽ là lý do tại sao mọi người phải thả xuống các truy vấn thủ công (và đó là nỗi đau).
brian d foy

1
Tôi không hiểu lý do tại sao bạn cần thả xuống các truy vấn thủ công cho các báo cáo. Tôi đã xây dựng một số báo cáo khá phức tạp bằng DBIC. Tất nhiên, nó thường liên quan đến việc xây dựng một tập kết quả tùy chỉnh lớn với việc sử dụng nhiều 'preetch' và 'tham gia'.
Dave Cross

Dave: SQL thủ công có thể dễ viết hơn nhiều và để đảm bảo bạn chỉ kéo bảy trường bạn cần từ ba bảng và biểu diễn chúng trong một hàng. Thêm vào đó, dễ dàng hơn nhiều để cung cấp gợi ý khi viết SQL thô.
Curtis Poe

> để đảm bảo bạn chỉ kéo bảy trường bạn cần Có, đó là những gì "cột" attr cho các tìm kiếm Kết quả được sử dụng cho. Các đối số hợp lệ duy nhất tôi đã nghe hoặc thấy để thực hiện SQL thô là: 1. Các truy vấn phụ cực kỳ phức tạp, thường là sản phẩm của một bảng được thiết kế tồi / DB 2. Chạy các hoạt động DDL hoặc 'do' khác, mà DBIC không phải là 't thực sự được xây dựng cho. 3. Cố gắng hack trong gợi ý chỉ số. Một lần nữa, đó là một điểm yếu của RDBMS, nhưng đôi khi nó cần phải được thực hiện. Và có thể chỉ cần thêm loại chức năng đó vào DBIC.
Brendan Byrd

8

Là một trong những nhà phát triển cốt lõi của nền tảng thương mại điện tử Interchange6 (và chuỗi lược đồ chính), tôi có kinh nghiệm khá sâu sắc với DBIC. Dưới đây là một vài trong số những điều làm cho nó trở thành một nền tảng tuyệt vời như vậy:

  • Trình tạo truy vấn cho phép bạn viết một lần cho nhiều công cụ cơ sở dữ liệu (và nhiều phiên bản của mỗi phiên bản). Chúng tôi hiện hỗ trợ Interchange6 với MySQL, PostgreSQL và SQLite và sẽ thêm hỗ trợ cho nhiều công cụ hơn một khi chúng tôi có được thời gian và tài nguyên. Hiện tại chỉ có hai đường dẫn mã trong toàn bộ dự án có mã bổ sung để phục vụ cho sự khác biệt giữa các công cụ và điều này hoàn toàn là do thiếu chức năng cơ sở dữ liệu cụ thể (SQLite thiếu vị trí) hoặc do sự ngu ngốc của MySQL đã thay đổi cách chức năng LEAST của nó xử lý NULL giữa hai phiên bản nhỏ.

  • Các truy vấn được xác định trước có nghĩa là tôi có thể xây dựng các phương thức đơn giản có thể được gọi (có hoặc không có đối số) từ mã ứng dụng để tôi giữ các truy vấn của mình chủ yếu bên trong định nghĩa lược đồ thay vì xả rác mã ứng dụng của tôi.

  • Tạo truy vấn có thể kết hợp cho phép các truy vấn được chia thành các truy vấn được xác định trước có thể hiểu được và sau đó kết hợp với nhau để tạo các truy vấn phức tạp, khó có thể duy trì lâu dài trong cả DBIC (thậm chí tệ hơn trong SQL thuần túy) nếu chúng được xây dựng trong một bước.

  • Schema :: Loader đã cho phép chúng tôi sử dụng DBIC với các ứng dụng cũ mang lại một hợp đồng thuê mới và con đường đơn giản hơn nhiều cho tương lai.

  • Các plugin DBIC, DeploymentHandler & Migration đều bổ sung vô cùng nhiều vào bộ công cụ giúp cuộc sống của tôi đơn giản hơn.

Một trong những khác biệt lớn giữa DBIC và hầu hết các nền tảng giống ORM / ORM khác là mặc dù nó cố gắng hướng dẫn bạn cách làm việc nhưng điều đó cũng không ngăn bạn làm bất kỳ điều điên rồ nào bạn thích:

  • Bạn có thể sử dụng các hàm SQL và các thủ tục được lưu trữ mà DBIC không biết chỉ bằng cách cung cấp tên hàm làm khóa trong truy vấn (cũng có thể dẫn đến một số niềm vui khi bạn cố gắng sử dụng LEAST trong MySQL ^^ nhưng đó không phải là lỗi của DBIC) .

  • SQL bằng chữ có thể được sử dụng khi không có 'cách DBIC' để làm điều gì đó và kết quả trả về vẫn được gói trong các lớp đẹp với các bộ truy cập.

TL; DR Tôi có thể không bận tâm sử dụng nó cho các ứng dụng thực sự đơn giản chỉ với một vài bảng nhưng khi tôi cần quản lý mọi thứ phức tạp hơn, đặc biệt là khả năng tương thích giữa các công cụ chéo và khả năng bảo trì dài hạn là chìa khóa, thì DBIC là nói chung là con đường ưa thích của tôi.


7

(Trước khi bắt đầu, tôi nên nói điều này chỉ so sánh các trình bao bọc DBI dựa trên DBIC, DBI và Mojo. Tôi không có kinh nghiệm với bất kỳ ORM Perl nào khác và vì vậy sẽ không nhận xét trực tiếp về chúng).

DBIC làm nhiều việc rất tốt. Tôi không phải là người sử dụng nó nhiều, nhưng tôi biết lý thuyết. Nó thực hiện khá tốt công việc tạo SQL và đặc biệt là (như tôi đã nói) xử lý các phép nối, v.v. Nó cũng có thể thực hiện tốt việc tìm nạp trước các dữ liệu liên quan khác.

Ưu điểm chính như tôi thấy đó là khả năng TRỰC TIẾP sử dụng kết quả làm lớp mô hình của bạn. Điều này còn được gọi là "thêm các phương thức thiết lập kết quả" trong đó bạn có thể nhận được kết quả của mình và gọi các phương thức trên các kết quả đó. Ví dụ phổ biến là tìm nạp một đối tượng người dùng từ DBIC và sau đó gọi một phương thức để kiểm tra xem mật khẩu của họ có hợp lệ không.

Chắc chắn việc triển khai lược đồ có thể khó, nhưng nó luôn khó. DBIC có các công cụ (một số trong các mô-đun bên ngoài) giúp dễ dàng hơn và có thể dễ dàng hơn việc quản lý các lược đồ của riêng bạn bằng tay.

Ở phía bên kia của đồng tiền, có những công cụ khác thu hút sự nhạy cảm khác, như trình bao bọc DBI có hương vị mojo. Chúng có sức hấp dẫn của nạc và vẫn có thể sử dụng. Hầu hết cũng đã lấy một gợi ý từ Mojo :: PG (bản gốc) và thêm các tính năng tiện dụng như quản lý lược đồ trong tích hợp tệp phẳng và pubsub.

Các mô-đun có hương vị Mojo này phát triển từ một điểm yếu khác của DBIC, đó là nó chưa (chưa) có khả năng thực hiện các truy vấn không đồng bộ. Các tác giả đã đảm bảo với tôi rằng nó có thể về mặt kỹ thuật có thể thậm chí nhanh chóng nhưng có vấn đề khi thiết kế một api sẽ phù hợp. (Phải thừa nhận rằng tôi thậm chí đã được yêu cầu giúp đỡ về vấn đề này, và trong khi tôi sẽ, tôi chỉ không biết làm thế nào để di chuyển cây kim trong thời gian tôi phải cống hiến cho nó).

TL; DR sử dụng DBIC trừ khi bạn yêu thích SQL hoặc bạn cần async, trong trường hợp đó điều tra các trình bao bọc DBI có hương vị Mojo.


6

Tôi đã viết những suy nghĩ của mình về điều này trong DBIC vs DBI ba năm trước. Tóm lại, tôi liệt kê hai lý do chính:

  1. DBIC có nghĩa là tôi không phải suy nghĩ về tất cả các SQL tầm thường cần thiết cho hầu hết mọi ứng dụng mà tôi viết.
  2. DBIC cung cấp cho tôi các đối tượng trở lại từ cơ sở dữ liệu thay vì các cấu trúc dữ liệu câm. Điều này có nghĩa là tôi có tất cả lòng tốt OO tiêu chuẩn để chơi. Đặc biệt tôi thấy nó thực sự hữu ích khi có thể thêm các phương thức vào các đối tượng DBIC của mình.

Đối với các mô hình chống, đó là điều duy nhất tôi có thể nghĩ đến là hiệu suất. Nếu bạn thực sự muốn loại bỏ mọi chu kỳ xung nhịp ra khỏi CPU thì có lẽ DBIC không phải là công cụ phù hợp cho công việc. Nhưng, chắc chắn đối với các ứng dụng viết, những trường hợp đó ngày càng hiếm. Tôi không thể nhớ lần cuối cùng tôi đã viết một ứng dụng mới nói chuyện với cơ sở dữ liệu và không sử dụng DBIC. Tất nhiên, sẽ hữu ích nếu bạn biết một chút về việc điều chỉnh các truy vấn mà DBIC tạo ra.


2
Huh, tôi không thể sửa lỗi chính tả vì tôi không thay đổi đủ ký tự ("righ ttool"). Tò mò què. Nhưng đây là loại câu trả lời đánh đố tôi. Tôi nghĩ trong bài đăng PerlHacks của bạn, bạn đề cập đến một điều mà Rob chỉ ra, nhưng đừng xem xét điều khác. Trong nhiều trường hợp, tôi đã tìm thấy mọi người quay lại SQL thủ công.
brian d foy

1

Cách tôi làm cho nó quy mô:

  1. tạo một lớp cung cấp phương thức kiểm tra và phương thức kiểm tra ổ cắm DBI.

  2. lấy lớp đó vào các lớp truy vấn SQL của bạn (một lớp trên mỗi bảng sql) và kiểm tra ổ cắm tại thời điểm xây dựng.

  3. sử dụng các biến trong phạm vi lớp để giữ tên bảng và tên cột chỉ mục chính của bạn.

  4. Viết tất cả tên bảng nội suy SQL và cột chỉ mục chính của bạn từ các biến đó thay vì xác định chúng trong SQL một cách tĩnh.

  5. sử dụng các macro biên tập để cho phép bạn tạo các cặp phương thức DBI cơ bản (chuẩn bị và thực thi) trong khi gõ CHỈ vào câu lệnh sql.

Nếu bạn có thể làm điều đó, bạn có thể viết mã API sạch trên DBI cả ngày một cách dễ dàng.

Những gì bạn sẽ tìm thấy, là rất nhiều truy vấn của bạn sẽ được di động trên nhiều bảng. Tại thời điểm đó, bạn có thể cắt và dán vào một lớp XUẤT KHẨU và rắc chúng trở lại nơi cần thiết. Đây là nơi nội suy phạm vi lớp của tên bảng và tên cột chỉ mục chính xuất hiện.

Tôi đã sử dụng phương pháp này để mở rộng tới hàng trăm phương thức DBI với hiệu suất tương đối tốt. Tôi sẽ không muốn thử và duy trì mã DBI theo bất kỳ cách nào khác.

Khi nào nên sử dụng DBI: Luôn luôn.

Tôi không nghĩ rằng đó là câu hỏi thực sự của bạn mặc dù. Câu hỏi thực sự của bạn là: "Cái này trông giống như một Pita khổng lồ, xin vui lòng cho tôi biết rằng tôi không phải làm điều này?"

Bạn không. Đặt nó bên phải và phần DBI đủ dư thừa để có thể tự động hóa nó.


Bất kỳ cơ hội nào bạn có một dự án nguồn mở mà bạn có thể chia sẻ, hoặc thậm chí có thể chỉ là một ý chính trên github với một ví dụ về mỗi lớp? Tôi nghĩ rằng những ý tưởng bạn đang nói là thú vị và có thể khả thi cho nhiều dự án của mọi người, nhưng sẽ dễ dàng hơn một chút để đi với một số ví dụ.
msouth

0

Tôi không phải là chuyên gia về Perl, nhưng tôi sử dụng nó rất nhiều. Có rất nhiều thứ tôi không biết hoặc biết cách làm tốt hơn; một số thứ tôi chỉ chưa có khả năng hiểu, mặc dù có tài liệu.

Tôi có xu hướng bắt đầu với DBI bởi vì tôi nghĩ, "Ồ, đây là một dự án đơn giản, tôi không cần sự phình to của ORM và tôi không muốn gặp rắc rối với các mô-đun thiết lập và Schema." Nhưng rất nhanh - hầu như mọi lúc - tôi nhanh chóng bắt đầu tự nguyền rủa mình vì quyết định đó. Khi tôi muốn bắt đầu sáng tạo trong các truy vấn SQL của mình (truy vấn động, không chỉ là giữ chỗ so sánh), tôi đấu tranh để duy trì sự tỉnh táo khi sử dụng DBI. SQL :: Tóm tắt giúp ích rất nhiều và thông thường có lẽ là đủ cho tôi. Nhưng cuộc đấu tranh tinh thần tiếp theo của tôi là duy trì rất nhiều SQL bên trong mã của tôi. Nó rất mất tập trung đối với tôi khi có các dòng và dòng SQL nhúng bên trong các heredocs xấu xí. Có lẽ tôi cần sử dụng một IDE chất lượng.

Cuối cùng, nhiều lần hơn không, tôi gắn bó với DBI thẳng. Nhưng tôi cứ ước có một cách tốt hơn. DBIx :: Class có một số đặc điểm thực sự gọn gàng và tôi đã sử dụng nó một vài lần, nhưng có vẻ như nó quá mức cần thiết cho tất cả trừ các dự án lớn nhất. Tôi thậm chí không chắc chắn rằng tôi thấy khó quản lý hơn: DBI với SQL hoặc DBIC phân tán với các mô-đun Schema phân tán.

(Ồ, những thứ như ràng buộc và kích hoạt là một điểm cộng rất lớn đối với tôi đối với DBIC.)


4
Câu trả lời này không đi đến điểm chính xác - chắc chắn, bạn có vấn đề khi sử dụng DBIx, nhưng tại sao bạn lại gặp phải những vấn đề đó? Là DBI không linh hoạt, kết hợp quá chặt chẽ với DB, không thể mở rộng, hoặc những gì?
Jay Elston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.