Есть ли способ получить список имен столбцов в sqlite?
Я хочу получить список имен столбцов из таблицы в базе данных. Используя прагму, я получаю список кортежей с большим количеством ненужной информации. Есть ли способ получить только имена столбцов? Поэтому я мог бы получить что-то вроде этого:
[Column1, Column2, Column3, Column4]
Причина, по которой мне абсолютно нужен этот список, заключается в том, что я хочу найти имя столбца в списке и получить индекс, потому что индекс используется во многих моих кодах.
Есть ли способ получить список, подобный этому?
Спасибо
Ответы
Ответ 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'
Вы должны получить таблицу, в которой перечислены все столбцы в указанной таблице. Для получения нужного результата может потребоваться некоторое изменение, но, надеюсь, его начало.