Как извлечь заголовки столбцов из существующей таблицы:
Вам не нужно анализировать оператор SQL "create table". Это удачно, так как синтаксис "create table" не приятен и не чист, он уродлив.
Вы можете использовать прагму table_info
. Это дает вам полезную информацию о каждом столбце в таблице, включая имя столбца.
Пример:
>>> #coding: ascii
... import sqlite3
>>>
>>> def get_col_names(cursor, table_name):
... results = cursor.execute("PRAGMA table_info(%s);" % table_name)
... return [row[1] for row in results]
...
>>> def wrong_way(cur, table):
... import re
... cur.execute("SELECT sql FROM sqlite_master WHERE name=?;", (table, ))
... sql = cur.fetchone()[0]
... column_defs = re.findall("[(](.*)[)]", sql)[0]
... first_words = (line.split()[0].strip() for line in column_defs.split(','))
... columns = [word for word in first_words if word.upper() != "CONSTRAINT"]
... return columns
...
>>> conn = sqlite3.connect(":memory:")
>>> curs = conn.cursor()
>>> _ignored = curs.execute(
... "create table foo (id integer, name text, [haha gotcha] text);"
... )
>>> print get_col_names(curs, "foo")
[u'id', u'name', u'haha gotcha']
>>> print wrong_way(curs, "foo")
[u'id', u'name', u'[haha'] <<<<<===== WHOOPS!
>>>
Другие проблемы с теперь удаленным ответом "разбирать таблицу создания SQL":
Наполняется, например, create table test (id1 text, id2 int, msg text, primary key(id1, id2))
... необходимо игнорировать не только CONSTRAINT
, но и ключевые слова PRIMARY
, UNIQUE
, CHECK
и FOREIGN
(см. create table
документы).
Необходимо указать re.DOTALL
в случае, если в SQL есть символы новой строки.
В line.split()[0].strip()
strip
является избыточным.