10

私は少数のエンティティしか持たないが、エンティティごとに多くの行を持つプロジェクト(Djangoで書かれた)に取り組んでいます。

私のアプリケーションには、プレーン SQL で直接記述された静的な「レポート」がいくつかあります。ユーザーは、一般的なフィルター フォームを使用してデータベースを検索することもできます。ターゲット オーディエンスは技術に精通しており、ある時点でフィルターがニーズに合わないため、YQLやJiraの高度な検索などのデータベース用のクエリ言語を作成することを考えています。

http://sourceforge.net/projects/littletable/http://www.quicksort.co.uk/DeeDoc.htmlを見つけましたが、メモリ内オブジェクトでのみ動作するようです。データベースはメモリ内に保持するには大きすぎる可能性があるため、実際の作業を行う前にクエリを SQL (または Django クエリの方がよい) に変換することをお勧めします。

これを行う方法に関するライブラリまたはベストプラクティスはありますか?

4

4 に答える 4

14

このようなDSLの作成は、PLYを使用すると実際には驚くほど簡単です。そして、Djangoには、必要なことを実行するための例がすでにあります。Qご覧のとおり、Djangoにはオブジェクトと呼ばれるこの凝ったものがあり、Djangoが物事の側面をクエリするのをかなり簡単にします。

DjangoCon EU 2012で、Matthieu Amiguetは、Djangoアプリケーションでのドメイン固有言語の実装というタイトルのセッションを行いました。このセッションでは、必要に応じてDSLを実装するまでのプロセスを実行しました。必要なものがすべて含まれている彼のスライドは、彼のWebサイトで入手できます。最終的なコード(とにかく最後のスライドからリンクされています)は、http://www.matthieuamiguet.ch/media/misc/djangocon2012/resources/compiler.htmlで入手できます。

Reinout van Reesも、そのセッションについていくつかの良いコメントを出しました。(彼は通常そうします!)これらは欠けている文脈の少しをカバーします。

そこには、与えられた例のYQLとJQLに非常によく似たものがあります。

  • groups__name="XXX" AND NOT groups__name="YYY"
  • (modified > 1/4/2011 OR NOT state__name="OK") AND groups__name="XXX"

また、非常に簡単に調整できます。たとえば、(私がそうする)groups.nameではなく、使用したい場合があります。groups__nameこの変更は、かなり簡単に行うことができます(.FIELDトークンで許可し、を変更してから、でオブジェクトを作成する前ににt_FIELD置き換えます)。.__Qp_expression_ID

つまり、これは単純なクエリを満たします。また、より複雑なDSLを作成したい場合の良い出発点にもなります。

于 2013-02-08T20:20:12.500 に答える
3

私はまさにこの問題に直面しました - 検索が必要な大規模なデータベースです。あなたと同じように、djangoを使用していくつかの静的レポートといくつかの派手なフィルターを作成しました( djangoでは非常に簡単です)。

しかし、パワーユーザーはもっと多くのことを求めていました。私は、彼ら全員が知っているDSLが既にあると判断しました - SQL。問題は、それを十分に安全にする方法でした。

そこで、django パーミッションを使用して、パワー ユーザーに新しいテーブルで SQL クエリを作成するパーミッションを付与しました。次に、それほど強力ではないユーザーがこれらのクエリを使用できるようにビューを作成しました。オプションのパラメータを取るようにしました。とにかく、djangoがORMの内部で使用しているPythonの低レベルDB-APIを使用して、クエリが実行されました。

本当のトリックは、読み取り専用のデータベース接続を開いてこれらのクエリを実行し、更新が実行されていないことを確認することでした。データベースに権限の低い別のユーザーを作成し、ビューでそのための特定の接続を開くことで、読み取り専用接続を作成しました。

TL;DR - SQL が最適です。

于 2012-06-09T09:33:43.340 に答える
1

実際には、 pyparsingを使用して独自の SQL っぽい言語を作成できます。拡張できる非常に冗長な例もあります。

于 2013-02-08T20:06:50.920 に答える
1

データの形式、ユーザーが使用する必要があるクエリの種類、およびデータが更新される頻度に応じて、Nick Craig-Wood によって提案された純粋な SQL ソリューションに代わる方法は、Solrでデータにインデックスを付けてから実行することです。それに対するクエリ。

Solr は複雑さ (構成、データ同期) のレイヤーが追加されていますが、超高速で、大規模なデータセットを処理でき、(比較的) 直感的なクエリ言語を提供します。

于 2012-06-09T09:55:21.673 に答える