Есть ли способ получить список имен столбцов в sqlite? - PullRequest
42 голосов
/ 20 октября 2011

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

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

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

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

Спасибо

Ответы [ 10 ]

106 голосов
/ 20 октября 2011

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

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

cursor.description - описание столбцов

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

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

names = [description[0] for description in cursor.description]
26 голосов
/ 13 сентября 2013

Альтернативой решению cursor.description из smallredstone может быть использование row.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'])

Подробнее об объектах Row в документации по Python .

11 голосов
/ 20 октября 2011

Насколько я могу судить, 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 table_info(tablename);

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

0|col1|INTEGER|1||1
1|col2|NVARCHAR(100)|1||0
2|col3|NVARCHAR(100)|1||0
7 голосов
/ 25 мая 2017

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

Если вы работаете в Python в интерактивном режиме и хотите просто «увидеть» имена столбцов, я нашел cursor.description для работы.

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
5 голосов
/ 09 августа 2016

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

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]
2 голосов
/ 06 ноября 2016

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

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)
1 голос
/ 02 марта 2019

Вы можете получить список имен столбцов, запустив:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql

Вы можете проверить, существует ли определенный столбец, запустив:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1

Справка:

https://www.sqlite.org/pragma.html#pragfunc

1 голос
/ 09 июня 2018

Мне нравится ответ @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] 

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

0 голосов
/ 03 марта 2019

Это очень просто.
Сначала создайте соединение, назовите его con.Затем запустите следующий код.

get_column_names=con.execute("select * from table_name limit 1")
col_name=[i[0] for i in get_column_names.description]
print(col_name)

Вы получите имя столбца в виде списка

0 голосов
/ 20 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...