2

すべて文字列の SQL クエリの大きなリストがあります。それらはPresto用に作成されているため、MySQL 用にフォーマットされています。

いくつかのクエリで記述されたテーブルの関係を引き出すことができるようにしたいと考えています。

簡単なことから始めましょう。

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 のようになります。

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つの注意点

  • 「AS」予約語がありません - 取得が難しくなる可能性があります
  • 結合するとき、2 つのテーブルを一緒に解析するために必要なものがたくさんあります。
  • これは単純な「結合」ではなく、左結合です

4000 のクエリで関係を引き出すことができる、Python 用の何らかの形式の SQL 解析ライブラリがあるかどうか疑問に思っています。そうでない場合、どうすればこれを効率的に行うことができますか? クエリをスキャンし、結合を見つけ、エイリアスを見つけてから、破棄する必要がある一連のストップワードを考慮しながら、それらがどのように結合されているかを確認する必要があると思います。

4

1 に答える 1

1

pyparsing の例の一部である select_parser.py ( https://sourceforge.net/p/pyparsing/code/HEAD/tree/trunk/src/examples/select_parser.py )に若干の変更を加えた後、これを取得します。最初の例を解析する:

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 形式で記述されているため、構文の一部を拡張する必要があります。

于 2016-09-13T01:48:09.630 に答える