sqlite 避免游标中的None,说明?

vshtjzan  于 2023-01-31  发布在  SQLite
关注(0)|答案(5)|浏览(172)

我在Python中使用sqlite3。
我的table:

cursor.execute("""create table student(rno int, name char(20), grade char, gender char, avg decimal(5,2), dob date);""")

其中cursor是我的游标对象的名称...
我使用cursor.description来显示列名,但是每个元组中有7个字符串,其中6个是None

print(cursor.description)
Output : (('rno', None, None, None, None, None, None), ('name', None, None, None, None, None, None), ('grade', None, None, None, None, None, None), ('gender', None, None, None, None, None, None), ('avg', None, None, None, None, None, None), ('dob', None, None, None, None, None, None))

在API中,很明显每个元组的前两个元素是必须的。但是我不这么认为。为什么?
此外,我应该在我的表中进行哪些更改,以获取设置为None的其他元素的值???
任何相关的帮助都是感激的......

fruv7luv

fruv7luv1#

DB API2.0的sqlite3只保证第一个项目。
它为每列返回一个7元组,其中每个元组的最后六项为None。
https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.description
要打印所有的细节,我想你应该有一些数据。可能是添加一些数据和执行一个选择语句

eit6fx6z

eit6fx6z2#

显然,在sqllite 3上type_code返回为None是一个bug,请参阅链接了解更多细节。
bug Details

c8ib6hqw

c8ib6hqw3#

这是一种方法,仍然使用原始代码中的cursor.description
1.创建一个函数以显示数据库中的所有记录

def show_all():
    # connect to db
    conn = sqlite3.connect('student.db')

    # create cursor
    c = conn.cursor()

    # query the db
    c.execute("SELECT rowid, * FROM student")

    items = c.fetchall()

    for item in items:
         print(item)

1.然后,在关闭正在使用的表/数据库的连接之前

# column names
    col_desc = []
    columns = c.description
    for column in columns:
        col_desc.append(column[0])
    print(col_desc)

1.然后,您可以在单独的文件中导入正在使用的database并执行函数

import student

students.show_all()
wz3gfoph

wz3gfoph4#

在他们的answer中,用户VN'sCorner观察到元组的第二个元素-类型代码-None是一个bug。事实上,它被 * 报告 * 为bug,但作为另一个bug report的副本关闭,而另一个bug report又被Gerhard Häring关闭为“Won 't Fix”(链接):
无法保证SQlite结果集中的所有列都具有相同的类型,这就是为什么我决定将类型代码设置为“undefined”。
SQLite的flexible typing是分辨率所指的,可以通过插入Python中的一些示例数据来演示:

>>> cur.execute('create table t (col text)')
<sqlite3.Cursor object at 0x7f00525c3f40>
>>> cur.execute('insert into t values (?)', ('spam',))
<sqlite3.Cursor object at 0x7f00525c3f40>
>>> cur.execute('insert into t values (?)', (b'spam',))
<sqlite3.Cursor object at 0x7f00525c3f40>
>>> conn.commit()

并查看SQLite3 shell中的类型:

sqlite> select col, typeof(col) from t;
spam|text
spam|blob
yhuiod9q

yhuiod9q5#

这就是为什么我只有一列

table_columns = [x[0] for x in con.execute('select * from table').description ]

骗局就是我的联系。

相关问题