CPAN DBIは、Perl で一般的なデータベースを使用するのに最適なデータベース インターフェイスですか? より良いオプションはありますか?
11 に答える
低レベルのデータベース アクセスだけを探している場合 — SQL 文字列 (オプションでプレースホルダーとバインド値を含む) をフィードすると、クエリが実行され、結果が返されます — そうです、DBIが最善の策です。はるかに。
より高いレベルのインターフェース (つまり、コードで生の SQL をほとんどまたはまったく使用する必要がないもの) が必要な場合は、Perl で使用できるORM (オブジェクト リレーショナル マッパー)がいくつかあります。詳細とリンクについては、Perl Foundation の Perl 5 wiki のORMページを参照してください。(それらの中から選択するためのサポートが必要な場合、または特定の質問がある場合は、この質問の焦点を絞り込むか、別の質問を投稿してください。)
DBI は、Perl と DBMS の間の「低レベル」インターフェースです。それを行うための唯一の現実的な選択肢です。Java の JDBC に匹敵します。Perl とデータベースの間の低レベル インターフェースに DBI 以外のものを選択するのは気が狂っている (または非常に特殊なユース ケースがある) でしょう。
DBI に加えて、データベースでの作業をより簡単かつクリーンにするさまざまなオブジェクト/リレーショナル マッパーがあります。
一般的な/より人気のあるもののいくつかは
DBI
ORM を必要としないタスクにプレーンを使用することを選択した場合は、 DBIx::Simpleを確認することを強くお勧めします。
これは代替品ではありませんが、その上にある非常によく設計された APIDBI
により、 の柔軟性を失うことなく、シンプルなものをシンプルに、複雑なものを可能にしますDBI
。
DBI
クエリの結果をハッシュ (列とその値) の配列参照 (行) として取得するなど、明らかに単純なことをドキュメントで調べる必要があることに気付いたことはありませんか? これDBIx::Simple
は簡単です:
# DBI
my $rows = $dbh->selectall_arrayref($sql, { Slice => {} });
# tell it we want "hashes" (yuck!) ^^^^
# DBIx::Simple
my $rows = $db->query($sql)->hashes; # does the same as the above code underneath!
詳細については、例をご覧ください。また、 SQL::Abstractとの統合により、単純なクエリが簡単になります。以前は使用していたすべてのコードでそれを使用しており、DBI
振り返ることはありません。
「より高いレベル」のインターフェース (SQL::Abstract など) と (DBIx::Simple) の大半は、実際にクエリを実行するときに DBI 自体を使用することに注意してください。DBI は、Perl でのデータベース接続の標準的な方法として受け入れられています。
オブジェクトを (イントロスペクションで!) 操作したい場合は、Moose に基づいて ORM を実装する Fey::ORM を見てください。また、非常に SQL に似た構文を備えているため、RDBMS ベースの私の脳には、他の ORM フレームワークよりも少し適しています。
DBIは素晴らしいですが、DBDモジュールの品質は異なる場合があります。DBD:pgのバージョンの1つで「機能」に噛まれました。結果をカーソルで処理するのではなく、結果の完全なデータをメモリにロードするのが好きでした。
いつものように-警告プログラム。
DBIロック!しかし、高速で完全な機能を備えた適切な ORM を得るには、常に DBIx::Class を使用してください。
Class::DBIも見てください。
私の意見では、DBI は本当に良い選択です。私は DBD::mysql を積極的に使用してきましたが、これが非常に優れたソリューションであることがわかりました。
すべてのプロジェクトでも DBI モジュールを使用しています。多くの場合、特定のアプリケーション用にその上にカスタム パッケージを構築しますが、その下にはコア DBI モジュールがあります。また、DBI モジュール関数を直接使用する方が簡単な場合もよくあります。