2012-03-27 1 views
2

私はSQLite 3でPythonを使用しています。ユーザーはSQLクエリを入力し、テンプレート言語の結果を書式設定する必要があります。PythonのDB APIで.description()を使ってテーブル名とカラム名を取得できますか?

基本的には、DB APIカーソル(PEP 249)の記述を使用する必要がありますが、多くの場合、ユーザーは結合を行うため、列名をテーブル名にする必要があります。

明らかな答え、つまりテーブル定義を読むことはできません。テーブルの多くは同じ列名を持っています。

私も... AVG(フィールド)のような集約関数のためのカラム/テーブル名にいくつかのインテリジェントな動作を必要とする

私が思い付くことができる唯一の解決策は、SQLパーサーを使用してSELECT文を分析することです(一息)が、私は本当に良いように見えるPythonのための任意のSQLパーサーを発見していない?

ドキュメンテーションや他の誰かが同じ問題を発見したわけではないので、何かが分からないことがありますか?

編集:問題は、selectステートメントがユーザーインターフェイスでユーザーによって提供されるSQL selectの結果を見つけることです。私はそれを支配していない。上で述べたように、テーブル定義を読むのは役に立ちません。

答えて

1

PythonのDB APIは、cursor.descriptionの列名のみを指定しています(このAPIのRDBMS実装では、クエリのテーブル名は返されません...理由を示します)。

あなたが求めていることは、非常に難しく、SQLパーサーでは手近でもあります...そして、その場合でも、"テーブル"のコンセプトであっても、多くのセンス。からtodayあるテーブル

  1. は、これらのSQL文を考えてみましょうか?からmyConstあるテーブル

    SELECT DATE('now') AS today FROM TableA FULL JOIN TableB 
    ON TableA.col1 = TableB.col1; 
    
  2. ?からmyCalcあるテーブル

    SELECT 1 AS myConst; 
    
  3. ?からmyColあるテーブル

    SELECT a+b AS myCalc FROM (select t1.col1 AS a, t2.col2 AS b 
    FROM table1 AS t1 
    LEFT OUTER JOIN table2 AS t2 on t1.col2 = t2.col2); 
    
  4. SELECT SUM(a) as myCol FROM (SELECT a FROM table1 UNION SELECT b FROM table2); 
    

上記では、SQLパーサを持っていた場合でも、...あなたは「テーブル」を補うために持っている、または任意のものを選択いずれかいる非常に単純なSQL文でした!

SQLは、結果としてのデータセットを返します。このセットの要素は、必ずしも特定のデータベース表に属しているとは限りません。おそらく、この問題に対するあなたのアプローチを再考する必要があります。

関連する問題