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

时间:2011-10-20 05:02:15

标签: python database sqlite

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

  

[Column1,Column2,Column3,Column4]

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

有没有办法获得这样的列表?

由于

12 个答案:

答案 0 :(得分:104)

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

答案 1 :(得分:26)

来自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()

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

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

详细了解Row objects in the python documentation

答案 2 :(得分:11)

据我所知,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

答案 3 :(得分:7)

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

如果你在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

答案 4 :(得分:5)

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

protected void ValInitPay_ServerValidate(object source, ServerValidateEventArgs args)
    {
            if (int.TryParse(InitPay.Text, out val))
            {
                if (val > 10 && val < 1000)
                {
                    args.IsValid = true;
                }
                else
                {
                    args.IsValid = false;
                    ValInitPay.ErrorMessage = "<img  src='images/err_msg.png' height='11px' width='11px' style='vertial-align:middle' />Out of range";
                }
            }
            else
            {
                args.IsValid = false;
                ValInitPay.ErrorMessage = "<img  src='images/err_msg.png' height='11px' width='11px' style='vertial-align:middle' />Not an integer";
            }

    }

答案 5 :(得分:2)

我用这个:

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)

答案 6 :(得分:1)

我喜欢@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] 

如果这是一个问题,您可以添加代码来清理表名。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

非常容易。
首先创建一个连接,命名为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)

您将获得列名作为列表

答案 9 :(得分:0)

使用编译指示的另一种方法:

undefined

答案 10 :(得分:0)

好吧,我可能会很晚才回答这个问题,但由于人们仍然关注这个线程,我只想分享我如何使用 python sqlite3 中的列名列表。

import sqlite3

def getVarList(con, tableName)
    return [fields[1] for fields in con.execute(f"PRAGMA table_info({tableName})").fetchall()]
    
conn = sqlite3.connect('foo.db')
varList = getVarList(conn, 'bar')

答案 11 :(得分:-1)

我不是一个sqlite用户,所以带上一粒盐;大多数RDBM都支持INFORMATION_SCHEMA视图的ANSI标准。如果您运行以下查询:

SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'your table'

您应该获得一个列出指定表中所有列的表。可能需要一些调整来获得你想要的输出,但希望它是一个开始。