有没有办法获取sqlite中的列名列表?
我想从数据库里的一个表中获取列名的列表。使用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]