有没有办法获取sqlite中的列名列表?

103 投票
15 回答
180900 浏览
提问于 2025-04-17 04:40

我想从数据库里的一个表中获取列名的列表。使用pragma命令时,我得到的是一堆包含很多不必要信息的元组。我想知道有没有办法只获取列名?这样我最终可能会得到像这样的结果:

[Column1, Column2, Column3, Column4]

我之所以需要这个列表,是因为我想在这个列表中查找某个列名,并获取它的索引,因为这个索引在我的很多代码中都会用到。

有没有办法得到这样的列表呢?

谢谢!

15 个回答

19

根据我的了解,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

PRAGMA table_info(tablename);

这样你会得到类似这样的结果

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

另一种替代 cursor.description 方法的方案是使用 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()

缺点是:只有在查询返回至少一行数据时,这个方法才有效。

好处是:你可以通过列的名称来访问数据(比如用 row['你的列名'])。

想了解更多关于 Python 文档中的 Row 对象的信息,可以去看看。

220

你可以使用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]

撰写回答