赞
踩
python-有没有办法获取sqlite中的列名列表?
我想从数据库中的表中获取列名列表。 使用编译指示,我会得到一个元组列表,其中包含很多不需要的信息。 有没有办法只获取列名? 所以我最终可能会遇到这样的事情:
[Column1,Column2,Column3,Column4]
之所以绝对需要此列表,是因为我想在列表中搜索列名并获取索引,因为很多代码中都使用了索引。
有没有办法得到这样的清单?
谢谢
11个解决方案
111 votes
您可以使用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]
smallredstone answered 2020-07-05T19:50:10Z
27 votes
smallredstone提供的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 ['your_column_name'])
在python文档中阅读有关Row对象的更多信息。
flokk answered 2020-07-05T19:50:44Z
12 votes
据我所知Sqlite不支持INFORMATION_SCHEMA。 相反,它具有sqlite_master。
我认为您无法仅通过一条命令就能获得所需的列表。 您可以使用sql或pragma获取所需的信息,然后使用regex将其拆分为所需的格式
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
wdavo answered 2020-07-05T19:51:21Z
7 votes
快速,互动的方式查看列名
如果您正在使用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
Joseph True answered 2020-07-05T19:51:59Z
5 votes
假设您知道表名,并且想要数据列的名称,那么可以使用列出的代码,这将以一种简单而优雅的方式满足我的口味:
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]
thebeancounter answered 2020-07-05T19:52:19Z
3 votes
您可以通过运行以下命令获取列名列表:
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://呜呜呜.SQLite.org/骗人啊干嘛.HTML#PR AG func]
user1461607 answered 2020-07-05T19:52:52Z
2 votes
我用这个:
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)
Luca Di Sabatino answered 2020-07-05T19:53:11Z
1 votes
我喜欢@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]
如果有问题,您可以添加代码以清理表名。
4dummies answered 2020-07-05T19:53:36Z
0 votes
这很容易。
首先创建一个连接,命名为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)
您将获得列名作为列表
Atif answered 2020-07-05T19:54:05Z
0 votes
使用编译指示的另一种方法:
> table = "foo"
> cur.execute("SELECT group_concat(name, ', ') FROM pragma_table_info(?)", (table,))
> cur.fetchone()
('foo', 'bar', ...,)
user3342816 answered 2020-07-05T19:54:24Z
-1 votes
我不是sqlite用户,所以请带一点盐。 大多数RDBM都支持INFORMATION_SCHEMA视图的ANSI标准。 如果运行以下查询:
SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'your table'
您应该获得一个表,该表列出了指定表中的所有列。 IT可能需要进行一些调整才能获得所需的输出,但是希望这是一个开始。
Stuart Ainsworth answered 2020-07-05T19:54:49Z
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。