Есть ли способ получить список имен столбцов в SQLite?

Я хочу получить список имен столбцов из таблицы в базе данных. Используя pragma, я получаю список кортежей с большим количеством ненужной информации. Есть ли способ получить только имена столбцов? Так что я могу закончить чем-то вроде этого:

[Столбец1, Столбец2, Столбец3, Столбец_4]

причина, по которой мне абсолютно нужен этот список, заключается в том, что я хочу найти имя столбца в списке и получить индекс, потому что индекс используется во многих моих код.

есть ли способ получить такой список?

спасибо

8 ответов


вы можете использовать sqlite3 и pep-249

import sqlite3
connection = sqlite3.connect('~/foo.sqlite')
cursor = connection.execute('select * from bar')

курсор.описание описание столбцов

names = list(map(lambda x: x[0], cursor.description))

в качестве альтернативы вы могли бы использовать список понимание:

names = [description[0] for description in cursor.description]

альтернатива курсор.описание решение от smallredstone можно использовать строки.keys ():

import sqlite3
connection = sqlite3.connect('~/foo.sqlite')
connection.row_factory = sqlite3.Row
cursor = connection.execute('select * from bar')
# instead of cursor.description:
row = cursor.fetchone()
names = row.keys()

недостаток: он работает только в том случае, если из запроса возвращается хотя бы строка.

преимущество: вы можете получить доступ к столбцам по их имени (строка ['your_column_name'])

подробнее о объекты строк в документации python.


насколько я могу судить, Sqlite не поддерживает INFORMATION_SCHEMA. Вместо этого он sqlite_master.

Я не думаю, что вы можете получить нужный список всего одной командой. Вы можете получить необходимую информацию с помощью sql или pragma, а затем использовать regex, чтобы разделить ее на нужный формат

SELECT sql FROM sqlite_master WHERE name='tablename';

дает вам что-то вроде

CREATE TABLE tablename(
        col1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        col2 NVARCHAR(100) NOT NULL,
        col3 NVARCHAR(100) NOT NULL,
)

или с помощью pragma

PRAGMA table_info(tablename);

дает вам что-то вроде

0|col1|INTEGER|1||1
1|col2|NVARCHAR(100)|1||0
2|col3|NVARCHAR(100)|1||0

быстрый, интерактивный способ увидеть имена столбцов

если вы работаете в интерактивном режиме в Python и просто хочет быстро увидеть имена столбцов, я нашел указатель.описание работы.

import sqlite3
conn = sqlite3.connect('test-db.db')
cursor = conn.execute('select * from mytable')
cursor.description

выводит что-то вроде этого:

(('Date', None, None, None, None, None, None),
 ('Object-Name', None, None, None, None, None, None),
 ('Object-Count', None, None, None, None, None, None))

или, быстрый способ получить доступ и распечатать их.

colnames = cursor.description
for row in colnames:
    print row[0]

выводит что-то вроде этого:

Date
Object-Name
Object-Count

предполагаю, что вы знаете имя таблицы и имена столбцов данных, вы можете использовать указанный код будет делать это в простой и элегантный способ на мой вкус:

import sqlite3

def get_col_names():
#this works beautifully given that you know the table name
    conn = sqlite3.connect("t.db")
    c = conn.cursor()
    c.execute("select * from tablename")
    return [member[0] for member in c.description]

Я использую этот:

import sqlite3

    db = sqlite3.connect('~/foo.sqlite')
    dbc = db.cursor()
    dbc.execute("PRAGMA table_info('bar')"
    ciao = dbc.fetchall()

    HeaderList=[]
    for i in ciao:
        counter=0
        for a in i:
            counter+=1
            if( counter==2):
                HeaderList.append(a)

print(HeaderList)

Мне нравится ответ @thebeancounter, но я предпочитаю параметризовать неизвестные, единственной проблемой является уязвимость к эксплойтам в имени таблицы. Если вы уверены, что все в порядке, то это работает:

def get_col_names(cursor, tablename):
    """Get column names of a table, given its name and a cursor
       (or connection) to the database.
    """
    reader=cursor.execute("SELECT * FROM {}".format(tablename))
    return [x[0] for x in reader.description] 

Если это проблема, вы можете добавить код для очистки имени таблицы.


Я не пользователь sqlite, поэтому возьмите это с солью; большинство RDBM поддерживают стандарт ANSI представлений INFORMATION_SCHEMA. Если вы запустите следующий запрос:

SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'your table'

вы должны получить таблицу, в которой перечислены все столбцы указанной таблицы. Может потребоваться некоторая настройка, чтобы получить желаемый результат, но, надеюсь, это начало.