Подтвердить что ты не робот

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

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

[Column1, Column2, Column3, Column4]

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

Есть ли способ получить список, подобный этому?

Спасибо

4b9b3361

Ответ 1

Вы можете использовать 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]

Ответ 2

Альтернативой решению 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'])

Подробнее о Строках в документации python.

Ответ 3

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

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

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

Ответ 4

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

Если вы работаете в интерактивном режиме на 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

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

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]

Ответ 6

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

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

Ответ 7

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

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)

Ответ 8

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

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

Ответ 9

Это очень просто.
Сначала создайте соединение, назовем его 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)

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

Ответ 10

Другой способ использования прагмы:

> table = "foo"
> cur.execute("SELECT group_concat(name, ', ') FROM pragma_table_info(?)", (table,))
> cur.fetchone()
('foo', 'bar', ...,)

Ответ 11

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

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

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