2016-09-13 5 views
1

私は文字列の中に大量のSQLクエリを持っていますが、それらはPrestoのために書かれています。PythonがSQLを解析して関係を見つけた

私はいくつかのクエリで書かれたテーブルの関係を分かりやすくしたいと思っています。

簡単な何かを始めるのをしてみましょう:

SELECT e.object_id, count(*) 
FROM schema_name.elements AS e 
     JOIN schema_name2.quotes AS q ON q.id = e.object_id 
WHERE e.object_type = 'something' 
GROUP BY e.object_id, q.query 
ORDER BY 2 desc; 

は物事が一緒に参加するところ明確に別名がありますが、見ることはできます - これをスキャンし、あまりにもエイリアスを見つける必要があるだろう - である「AS」というキーワードとして罰金です中古。

私は、クエリのための関係のリストを返したにしたいと思いますので、それぞれの関係は、この辞書のようなものになります。

dict = {'SourceSchema': 'schema_name', 
'SourceTable': "elements", 
'SourceColumn': "object_id", 
'TargetSchema': "schema_name2", 
'TargetTable': "quotes", 
'TargetColumn': "id"} 

を、私はそれを行うことは非常に簡単であることを想像することができますが、ものはより多くを取得します複雑:

SELECT e.object_id, count(*) 
FROM schema_name.elements e 
     LEFT JOIN schema_name2.quotes q ON q.id = cast(coalesce(nullif(e.object_id,''),'0') as bigint) 
WHERE e.object_type = 'something' 
GROUP BY e.object_id, q.query 
ORDER BY 2 desc; 

3物事が予約語 "と" ミッシング

  • を注意する - それを作ることができます難しく一緒
  • 参加すると、2つのテーブルを解析するために必要なものがたくさんあります
  • これは、単純な、それはいくつかがあります場合、私は思ったんだけど

に参加左だ「結合」ではありませんを取得しますPython用のSQL解析ライブラリの形式は、4000件のクエリで関係を解き放つことができますか?もしそうでなければ、私はこれをいかに効率的に行うことができますか?私は、クエリをスキャンして、ジョインを見つけ、エイリアスを見つけて、それらを削除しなければならないストップワードを考慮に入れながら、どのように参加しているかを見ていく必要があるかもしれないと推測しています。 pyparsing例の一部であるselect_parser.py(https://sourceforge.net/p/pyparsing/code/HEAD/tree/trunk/src/examples/select_parser.py)にはいくつかのマイナーな変更により

答えて

1

、私はあなたの最初の例を解析した後、これを取得する:

SELECT e.object_id, count(*) FROM schema_name.elements AS e  JOIN schema_name2.quotes AS q ON q.id = e.object_id WHERE e.object_type = 'something' GROUP BY e.object_id, q.query ORDER BY 2 desc; 
['SELECT', [['e.object_id'], ['count', '*']], 'FROM', [['schema_name', '.', 'elements'], 'AS', 'e', ['JOIN'], ['schema_name2', '.', 'quotes'], 'AS', 'q', ['ON', ['q.id', '=', 'e.object_id']]], 'WHERE', ['e.object_type', '=', 'something'], 'GROUP', 'BY', [['e.object_id'], ['q.query']], 'ORDER', 'BY', [['2', 'DESC']], ';'] 
- columns: [['e.object_id'], ['count', '*']] 
    [0]: 
    ['e.object_id'] 
    [1]: 
    ['count', '*'] 
- from: [[['schema_name', '.', 'elements'], 'AS', 'e', ['JOIN'], ['schema_name2', '.', 'quotes'], 'AS', 'q', ['ON', ['q.id', '=', 'e.object_id']]]] 
    [0]: 
    [['schema_name', '.', 'elements'], 'AS', 'e', ['JOIN'], ['schema_name2', '.', 'quotes'], 'AS', 'q', ['ON', ['q.id', '=', 'e.object_id']]] 
    - table_alias: [['e'], ['q']] 
     [0]: 
     ['e'] 
     [1]: 
     ['q'] 
- order_by_terms: [['2', 'DESC']] 
    [0]: 
    ['2', 'DESC'] 
    - direction: DESC 
    - order_key: 2 
- where_expr: ['e.object_type', '=', 'something'] 

だから、この例のように見えるあなたが得るのを助けるかもしれません開始しました。これはSQLiteのSELECTフォーマットに書かれているので、いくつかの構文を拡張する必要があります。

+0

ありがとうございました!はい、私のためにこれを行うためにpyparsingを得ることが最も簡単な方法だろうと思います。私はいくつかのことを探して、私もこれを投稿した後にこれを見つけました:http://pyparsing.wikispaces.com/file/view/select_parser.py/158651233/select_parser.py – edumike

関連する問題