从空表中获取列名列表

8 投票
2 回答
14165 浏览
提问于 2025-04-16 17:34

我在使用Python的sqlite3模块,想要在一个没有任何数据的表中获取所有列的列表。

通常,如果我创建一个数据库,比如:

import sqlite3

conn = sqlite3.connect(":memory:") 
c = conn.cursor()

# create the table schema
c.execute('''create table stocks
 (date text, trans text, symbol text,
  qty real, price real)''')

conn.commit()
c.close()

然后我可以通过类似下面的方式获取列名:

conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('select * from stocks')
r = c.fetchone()
print r.keys()

问题是,如果这个表一开始是空的,c.fetchone()会返回None。如果表里有数据,我就能获取到列名的列表。

有没有其他的方法可以做到这一点?我查阅了官方的sqlite3 模块文档,但没有找到相关的有用信息。

我想我可以在表里放一些虚拟数据,然后再获取列名,最后再删除那行数据,但我希望能有更优雅的方法。

编辑:

看起来有几种方法可以做到这一点:

  1. 获取创建表时使用的SQL语句:

    c.execute("""SELECT sql FROM sqlite_master 
    WHERE tbl_name = 'stocks' AND type = 'table'""")
    
  2. 使用sqlite3的PRAGMA语句:

    c.execute("PRAGMA table_info(stocks)")
    
  3. 使用Cursor对象的.description字段:

    c.execute('select * from stocks')
    r=c.fetchone()
    print c.description
    

在这些方法中,第二种似乎是最简单和直接的。感谢大家的帮助。

2 个回答

3

在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这些问题可能是因为我们在写代码的时候,某些地方没有注意到,或者是对某些概念理解得不够透彻。

比如说,变量的使用、函数的调用、数据类型的选择等等,都是我们需要仔细考虑的地方。每当遇到问题时,首先要冷静下来,仔细检查自己的代码,看看是不是哪里写错了,或者是逻辑上有什么不对的地方。

另外,查阅相关的文档和资料也是一个很好的办法,很多时候我们可以从中找到解决问题的线索。还有就是,向其他人请教也是一个不错的选择,大家一起讨论,往往能更快找到问题的根源。

总之,编程是一门需要不断学习和实践的技能,遇到问题时不要气馁,慢慢来,总能找到解决办法。

import sqlite3
con=sqlite3.connect(":memory:")
c=con.cursor()
c.execute("select * from stocks")
fieldnames=[f[0] for f in c.description]
5

可以试试这个:

conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('select * from stocks')
r = c.fetchone()
print c.description            # This will print the columns names

>>> (('date', None, None, None, None, None, None), ('trans', None, None, None, None, None, None), ('symbol', None, None, None, None, None, None), ('qty', None, None, None, None, None, None), ('price', None, None, None, None, None, None))

正如这里所解释的,每个7个元素的元组中,只有第一个元素是有用的。

撰写回答