2016-08-18 4 views
-2

SQLクエリ(PostgreSQLの種類)を解析し、それらの構造化表現を与えるライブラリがありますか? sqlparseがありますが、これではクエリが使用しているテーブルを簡単に把握することはできません。私はSELECTクエリのサポートが必要ですが、その中のいくつかは非常に複雑です。SQLを階層的な結果に解析して解析する

+0

あなたはあなたが求めているものの例を挙げることができますか? –

答えて

2

pyparsingに付属しているselect_parser.pyの例では、ステートメントのParseResultsデータ構造が得られます。ここで埋め込まれたテストケースは次のとおり

select * from xyzzy where z > 100 
select * from xyzzy where z > 100 order by zz 
select * from xyzzy 
select z.* from xyzzy 
select a, b from test_table where 1=1 and b='yes' 
select a, b from test_table where 1=1 and b in (select bb from foo) 
select z.a, b from test_table where 1=1 and b in (select bb from foo) 
select z.a, b from test_table where 1=1 and b in (select bb from foo) order by b,c desc,d 
select z.a, b from test_table left join test2_table where 1=1 and b in (select bb from foo) 
select a, db.table.b as BBB from db.table where 1=1 and BBB='yes' 
select a, db.table.b as BBB from test_table,db.table where 1=1 and BBB='yes' 
select a, db.table.b as BBB from test_table,db.table where 1=1 and BBB='yes' limit 50 

結果は、入力文の異なる構成要素に構造化され、名前フィールドは、オブジェクトの属性(result.table'XYZZY'result.where_expr['z', '>', '100']、等)のようにアクセスすることができます。

select * from xyzzy where z > 100 
['SELECT', ['*'], 'FROM', 'xyzzy', 'WHERE', ['z', '>', '100']] 
- columns: ['*'] 
- from: ['xyzzy'] 
- table: ['xyzzy'] 
- where_expr: ['z', '>', '100'] 


select * from xyzzy where z > 100 order by zz 
['SELECT', ['*'], 'FROM', 'xyzzy', 'WHERE', ['z', '>', '100'], 'ORDER', 'BY', [['zz']]] 
- columns: ['*'] 
- from: ['xyzzy'] 
- order_by_terms: [['zz']] 
    [0]: 
    ['zz'] 
    - order_key: zz 
- table: ['xyzzy'] 
- where_expr: ['z', '>', '100'] 


select * from xyzzy 
['SELECT', ['*'], 'FROM', 'xyzzy'] 
- columns: ['*'] 
- from: ['xyzzy'] 
- table: ['xyzzy'] 

これは、SQLiteのためのSQL方言に書かれていたが、Postgresのに適応することは、あまりにもひどいではありません。ここでは最初の3回の試験の結果です。

関連する問題