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

Den*_*man 46 python database sqlite

我想从数据库中的表中获取列名列表.使用pragma我得到一个包含大量不需要信息的元组列表.有没有办法只获取列名?所以我可能最终得到这样的东西:

[Column1,Column2,Column3,Column4]

我绝对需要这个列表的原因是因为我想在列表中搜索列名并获取索引,因为索引在我的很多代码中使用.

有没有办法得到这样的清单?

谢谢

小智 114

你可以使用sqlite3和pep-249

import sqlite3
connection = sqlite3.connect('~/foo.sqlite')
cursor = connection.execute('select * from bar')
Run Code Online (Sandbox Code Playgroud)

cursor.description是列的描述

names = list(map(lambda x: x[0], cursor.description))
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用列表理解:

names = [description[0] for description in cursor.description]
Run Code Online (Sandbox Code Playgroud)

  • 在python3中,你可以在python2中执行`next(zip(*cursor.description))`或`zip(*cursor.description)[0]` (3认同)

小智 27

来自smallredstonecursor.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()
Run Code Online (Sandbox Code Playgroud)

缺点:只有在查询返回至少一行时才有效.

好处:您可以按名称访问列(row ['your_column_name'])

阅读python文档中有关Row对象的更多信息.

  • 与“cursor.description”相比,我更喜欢“row_factory”的想法。抛开缺点不谈,你的代码不会充斥着 `row[names['column_name']]` ,而是使用更具可读性的 `row['column_name']` 模式(这是 python 之后的全部要点)全部!)。 (2认同)

wda*_*avo 12

据我所知,Sqlite不支持INFORMATION_SCHEMA.相反,它有sqlite_master.

我认为你不能只用一个命令获得你想要的列表.您可以使用sql或pragma获取所需的信息,然后使用正则表达式将其拆分为您需要的格式

SELECT sql FROM sqlite_master WHERE name='tablename';
Run Code Online (Sandbox Code Playgroud)

给你一些类似的东西

CREATE TABLE tablename(
        col1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        col2 NVARCHAR(100) NOT NULL,
        col3 NVARCHAR(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

或者使用pragma

PRAGMA table_info(tablename);
Run Code Online (Sandbox Code Playgroud)

给你一些类似的东西

0|col1|INTEGER|1||1
1|col2|NVARCHAR(100)|1||0
2|col3|NVARCHAR(100)|1||0
Run Code Online (Sandbox Code Playgroud)


use*_*607 8

您可以通过运行获取列名列表:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql
Run Code Online (Sandbox Code Playgroud)

您可以通过运行来检查某个列是否存在:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1
Run Code Online (Sandbox Code Playgroud)

参考:

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


Ati*_*tif 8

这很容易。
首先创建一个连接,我们将其命名为con。然后运行以下代码。

cur =con.cursor()
cur.execute("select * from table_name limit 1")
col_name=[i[0] for i in cur.description]
print(col_name)
Run Code Online (Sandbox Code Playgroud)

您将获得列表形式的列名称


Jos*_*rue 7

快速,交互式的方式来查看列名称

如果您在Python中以交互方式工作并且只想快速"查看"列名,我发现cursor.description可以工作.

import sqlite3
conn = sqlite3.connect('test-db.db')
cursor = conn.execute('select * from mytable')
cursor.description
Run Code Online (Sandbox Code Playgroud)

输出如下:

(('Date', None, None, None, None, None, None),
 ('Object-Name', None, None, None, None, None, None),
 ('Object-Count', None, None, None, None, None, None))
Run Code Online (Sandbox Code Playgroud)

或者,快速访问和打印出来的方式.

colnames = cursor.description
for row in colnames:
    print row[0]
Run Code Online (Sandbox Code Playgroud)

输出如下:

Date
Object-Name
Object-Count
Run Code Online (Sandbox Code Playgroud)

  • 根据 Python 文档,看起来“无”只是空占位符“...为了与 Python DB API 保持兼容...”。请参阅:https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.description (3认同)
  • 在cursor.descrition的输出中,多个“无”到底指的是什么? (2认同)

the*_*ter 6

假设您知道表名,并希望使用列出的代码的数据列的名称将以一种简单而优雅的方式完成我的尝试:

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]
Run Code Online (Sandbox Code Playgroud)