2016-08-18 4 views
-2

Gibt es irgendeine Bibliothek (vorzugsweise in Python), die SQL-Abfragen parsen kann (die PostgreSQL-Art), und mir eine strukturierte Darstellung von ihnen geben? Es gibt sqlparse, aber das erlaubt mir nicht, die Tabelle, die eine Abfrage verwendet, einfach herauszufinden (sagen). Ich brauche nur Unterstützung für SELECT Abfragen, aber einige von ihnen können sehr komplex sein.SQL in ein hierarchisches Ergebnis analysieren, um es zu analysieren

+0

Können Sie Beispiele geben, wonach Sie fragen? –

Antwort

2

Das Beispiel select_parser.py, das mit pyparsing geliefert wird, gibt Ihnen eine ParseResults-Datenstruktur der Anweisung. Hier sind die eingebetteten Testfälle:

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 

Die Ergebnisse gliedert sich in verschiedene Komponenten des Eingangsrechnung, und die genannten Felder kann zugegriffen werden, wie Objektattribute (result.table: 'XYZZY', result.where_expr: ['z', '>', '100'], etc.). Hier sind die Ergebnisse aus den ersten drei Tests:

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'] 

Es wurde für SQLite auf den SQL-Dialekt geschrieben, aber auf Postgres Anpassung sollte nicht zu schrecklich sein.

Verwandte Themen