@Padidem: Ähm, die Antwort wird nicht einfacher, egal wie oft Du fragst: Du musst die jeweilige SQL-CREATE-Anweisung parsen. Das ist nicht leicht.
Ausser es ist eine Lösung gefragt die nur mit den Beispieldaten funktioniert, aber nicht mehr funktioniert wenn man es auf eine andere Datenbank anwendet oder sich die Anweisungen bei der vorhandenen Datenbank ändern. Zum Beispiel weil Primär- und Fremdschlüssel hinzugefügt werden, was man eigentlich bei jeder Datenbank mindestens erwarten würde.
Alternativ kannst Du nach einer fertigen Bibliothek suchen. `sqlparse` wurde schon erwähnt. Das halte ich aber nicht unbedingt für geeignet weil der entsprechende Teil mit den Deklarationen den man sich aus dem geparsten ``CREATE`` herausfischen kann so aussieht:
Code: Alles auswählen
In [82]: p.tokens
Out[82]:
[<Punctuation '(' at 0x8ea4824>,
<Newline ' ' at 0x8ea47d4>,
<Whitespace ' ' at 0x8ea47fc>,
<Identifier '[index]' at 0x8ea326c>,
<Whitespace ' ' at 0x8ea489c>,
<Builtin 'INTEGER' at 0x8ea49b4>,
<Punctuation ',' at 0x8ea4d24>,
<Newline ' ' at 0x8ea466c>,
<Whitespace ' ' at 0x8ea4f7c>,
<Identifier '[land]' at 0x8ea32ac>,
<Whitespace ' ' at 0x8ea4cfc>,
<Builtin 'TEXT' at 0x8ea4374>,
<Punctuation ',' at 0x8ea4cd4>,
<Newline ' ' at 0x8ea4d74>,
<Whitespace ' ' at 0x8ea4234>,
<Identifier '[kuerz...' at 0x8ea32ec>,
<Whitespace ' ' at 0x8ea4324>,
<Builtin 'TEXT' at 0x8ea4874>,
<Punctuation ',' at 0x8ea443c>,
<Newline ' ' at 0x8ea439c>,
<Whitespace ' ' at 0x8ea4eb4>,
<Identifier '[haupt...' at 0x8ea332c>,
<Whitespace ' ' at 0x8ea470c>,
<Builtin 'TEXT' at 0x8ea4dec>,
<Punctuation ',' at 0x8ea4c0c>,
<Newline ' ' at 0x8ea457c>,
<Whitespace ' ' at 0x8ea4f54>,
<Identifier '[beitr...' at 0x8ea336c>,
<Whitespace ' ' at 0x8ea4edc>,
<Builtin 'INTEGER' at 0x8ea4fcc>,
<Punctuation ',' at 0x8ea4d4c>,
<Newline ' ' at 0x8ea4b6c>,
<Whitespace ' ' at 0x8ea4914>,
<Identifier '[regie...' at 0x8ea33ac>,
<Whitespace ' ' at 0x8ea4dc4>,
<Builtin 'TEXT' at 0x8ea4554>,
<Punctuation ',' at 0x8ea42d4>,
<Newline ' ' at 0x8ea4694>,
<Whitespace ' ' at 0x8ea47ac>,
<Identifier '[regie...' at 0x8ea33ec>,
<Whitespace ' ' at 0x8ea4504>,
<Builtin 'TEXT' at 0x8ea48c4>,
<Punctuation ',' at 0x8ea475c>,
<Newline ' ' at 0x8ea4b1c>,
<Whitespace ' ' at 0x8ea461c>,
<Identifier '[stimm...' at 0x8ea342c>,
<Whitespace ' ' at 0x8ea4c5c>,
<Builtin 'INTEGER' at 0x8ea4acc>,
<Punctuation ',' at 0x8ea46e4>,
<Newline ' ' at 0x8ea44dc>,
<Whitespace ' ' at 0x8ea4c84>,
<Identifier '[flaec...' at 0x8ea346c>,
<Whitespace ' ' at 0x8ea4f2c>,
<Builtin 'INTEGER' at 0x8ea43ec>,
<Punctuation ',' at 0x8ea448c>,
<Newline ' ' at 0x8ea49dc>,
<Whitespace ' ' at 0x8ea4aa4>,
<Identifier '[einwo...' at 0x8ea34ac>,
<Whitespace ' ' at 0x8ea48ec>,
<Builtin 'REAL' at 0x8ea4cac>,
<Punctuation ',' at 0x8ea4a04>,
<Newline ' ' at 0x8eab0f4>,
<Whitespace ' ' at 0x8eab1bc>,
<Identifier '[einwo...' at 0x8ea34ec>,
<Whitespace ' ' at 0x8eab0a4>,
<Builtin 'INTEGER' at 0x8eab144>,
<Punctuation ',' at 0x8eab11c>,
<Newline ' ' at 0x8eab07c>,
<Whitespace ' ' at 0x8eab234>,
<Identifier '[ausla...' at 0x8ea352c>,
<Whitespace ' ' at 0x8eab20c>,
<Builtin 'REAL' at 0x8eab2d4>,
<Punctuation ',' at 0x8eab2fc>,
<Newline ' ' at 0x8eab054>,
<Whitespace ' ' at 0x8eab02c>,
<Identifier '[sprac...' at 0x8ea356c>,
<Whitespace ' ' at 0x8eab0cc>,
<Builtin 'TEXT' at 0x8eab194>,
<Newline ' ' at 0x8eab1e4>,
<Whitespace ' ' at 0x8eab25c>,
<Punctuation ')' at 0x8eab324>]
Für die vorhandene Tabelle kann man sich da jetzt natürlich paarweise die `Identifier`- und `Builtin`-Exemplare heraus fischen, aber das würde von der Robustheit einer billigen Lösung mit Zeichenkettenoperationen entsprechen. `sqlparser` gruppiert nicht die einzelnen Spaltendeklarationen und das wird halt kompliziert wenn da noch Primär-, Fremdschlüssel-, oder weitere Constraints angegeben werden. Da würde ich mir dann doch eher eine Parserbibliothek wie `pyparsing` und die SQLite-Dokumentation schnappen und selbst einen Parser schreiben der ein Ergebnis liefert was mehr in die Richtung geht die man hier benötigt.
SQLAlchemy wäre vielleicht noch ein Ansatz und dort dann versuchen ob bei SQLite „reflection” gut genug funktioniert.
Das erscheint mir insgesamt nicht als anfängertaugliche Aufgabe wenn da etwas heraus kommen soll was kein hässlicher Hack ist. Denn alles andere ist dann doch ein klein wenig komplexer.