2012-03-27 12 views
2

Ich benutze Python mit SQLite 3. Ich habe Benutzer SQL-Abfragen eingegeben und müssen die Ergebnisse von denen für eine Vorlagensprache formatieren.Kann ich Tabellennamen zusammen mit Spaltennamen mithilfe von .description() in Pythons DB-API abrufen?

Also, im Grunde muss ich .description des DB-API-Cursors (PEP 249) verwenden, aber ich muss beide Spaltennamen und die Tabellennamen, da die Benutzer oft verbindet.

Die offensichtliche Antwort, d.h. das Lesen der Tabellendefinitionen, ist nicht möglich - viele der Tabellen haben die gleichen Spaltennamen.

ich etwas intelligentes Verhalten auch für Aggregatfunktionen wie avg (Feld) auf die Spalten/Tabellennamen müssen ...

Die einzige Lösung, die ich mit ist aufwarten kann eine SQL-Parser und analysieren, die SELECT-Anweisung zu verwenden, (seufzt), aber ich habe keinen SQL-Parser für Python gefunden, der wirklich gut aussieht?

Ich habe nichts in der Dokumentation oder jemand anderes mit dem gleichen Problem gefunden, so dass ich etwas offensichtlich übersehen haben könnte?

Edit: Um klar zu sein - das Problem ist, das Ergebnis einer SQL-Auswahl zu finden, wo die Select-Anweisung von einem Benutzer in einer Benutzeroberfläche bereitgestellt wird. Ich habe keine Kontrolle darüber. Wie ich oben erwähnt habe, hilft es nicht, die Tabellendefinitionen zu lesen.

Antwort

1

Python DB API spezifiziert nur Spaltennamen für die cursor.description (und keine der RDBMS-Implementierungen dieser API wird Tabellennamen für Abfragen zurückgeben ... Ich werde Ihnen zeigen, warum).

Was Sie fragen ist sehr schwer, und nur mit einem SQL-Parser sogar zugänglich ... und selbst dann gibt es viele Situationen, in denen selbst das Konzept, das "Tabelle" eine Spalte ist möglicherweise nicht machen viel Sinn.

Betrachten Sie diese SQL-Anweisungen:

  1. Welche Tabelle ist today aus?

    SELECT DATE('now') AS today FROM TableA FULL JOIN TableB 
    ON TableA.col1 = TableB.col1; 
    
  2. Welche Tabelle ist myConst aus?

    SELECT 1 AS myConst; 
    
  3. Welche Tabelle ist myCalc aus?

    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. Welche Tabelle ist myCol aus?

    SELECT SUM(a) as myCol FROM (SELECT a FROM table1 UNION SELECT b FROM table2); 
    

Die oben waren sehr einfache SQL-Anweisungen, für die Sie entweder einen „Tisch“ machen müssen, oder willkürlich eine auswählen ... selbst wenn Sie einen SQL-Parser hatten!

Was SQL Ihnen gibt, ist ein Datensatz zurück als Ergebnisse.Die Elemente in diesem Satz können nicht unbedingt bestimmten Datenbanktabellen zugeordnet werden. Sie müssen wahrscheinlich Ihre Herangehensweise an dieses Problem überdenken.