注:
SQL
クエリに変換するDjango ORM
がすでにあることは知っています。raw SQL
クエリを記述することをお勧めします。raw sql
クエリを作成すると、使用しているデータベースでコードがトラップされます。Django orm
だけでは達成できないデータベースの能力を最大限に活用することの重要性も理解しています。私の質問 :
複数の結合を持つクエリがあり、未加工のSQLクエリを作成することにしました。さて、それは私のウェブサイトを
postgres
固有のものにします。 postgres固有の機能を使用していない場合でも、.
データベースのSQLクエリに変換できるfake sql
言語があるはずだと思います。 DjangoのORMでも構築できます。したがって、ORMを終了してもデータベース固有ではない場合でも、データベースに依存しないままにすることができます。
同じ質問をJacob Kaplan Moss
(対面)に行いました:
database independent
であるべきだということではありませんでした。説明してください、なぜ実際のSQLの上にfake sql
レイヤーがあるべきですか?
================================
更新:
================================
私の提案:
fake sql
レベルでデータベースの独立性を解決し、その偽のSQLでORMを構築します。したがって、SQLクエリを作成する必要がある場合は、fake sql
を使用します。これは、未加工のSQLであるすべてのデータベースで機能します。そうすれば、自分のデータベースに固有の機能を使用しない限り、データベースに依存しないままになります。
したがって、select * from table limit 10;
のようなクエリは、postgres
と 'MS-SQL Server'の両方で機能します。
それは賢明ですか?
注:
ANSI SQL
について話しているのではなく、すべてのデータベースを1つの標準SQLで動作させるためにfake sql
を提案しています。 [db固有の機能をカバーしていない可能性があります]SQL ANSI標準 を探していると思います。
この標準は、大部分のRDBMSに実装されています。
ただし、すべてのRDBMSは、いくつかのことを自分のやり方で行うことにしました。 (単に標準に機能がないか、または別の理由があるためです。LIMIT
には、たとえばSQL:2008以降のみ同等の機能があります。)
これらのSQL標準との違いをリストアップするには、Webページ全体が必要です。あら、 やった !
したがって、あなたに答えるために、このまさに理由により、パフォーマンスを失うことなく(つまり、レイヤーを構築することなく)RDBMSから独立することはできません。 SQL標準実装の違いは、人々にORMを構築させたものです。
この場合、YAGNIの原則は重要です。
トピックを決定するときは、特定のデータベースに関連付けられることの利点と欠点を考慮する必要があります。
数千ものデータベースが存在するわけではありません。リレーショナルデータベースの場合、一般的な選択肢はPostgresとMysqlです。また、それらの違いや特徴はよく知られているので、解決しようとしている問題について事前に比較するのは簡単です。
運用環境を管理している場合は、それらの違いを調べて選択してください。
ソフトウェアをエンドユーザーに配布し、エンドユーザーが独自のプラットフォームにインストールする場合など、運用環境の管理下にない場合は、データベースの独立性を目指す必要があります。
データベースに依存しないという説得力のある理由がない限り、面倒であり、長期的にはそうすることを目的とする場合、あなたを悩ませます。この種の状況に対する一般的なアドバイスは、それを行うためだけに物事を行うことではありません。