在cursor.description中避免使用None?

问题描述 投票:0回答:6

我在 Python 中使用 SQLite3。

我的桌子:

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

其中光标是我的光标对象的名称。

我使用

cursor.description
显示列名称。但每个元组中有七个字符串,其中六个是 None。

print(cursor.description)

输出(格式化):

(
  ('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)
)

DB-API PEP 可以清楚地看出,每个元组的前两个元素是必需的。但这不适合我。为什么?

另外,我应该在表中进行哪些更改才能获取设置为“无”的其他元素的值?

python sqlite database-cursor
6个回答
4
投票

DB API2.0 的 sqlite3 仅保证第一项。

它为每列返回一个 7 元组,其中每列的最后 6 项 元组没有。

https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.description

要打印所有详细信息,我想您应该有一些数据。 可能会添加一些数据并执行选择语句


1
投票

显然 type_code 在 sqllite 3 上返回为 None 是一个错误,请参阅链接了解更多详细信息。

错误详情


0
投票

这是一种方法。仍在原始代码中使用

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

0
投票

在他们的 answer 中,用户 VN'sCorner 观察到元组的第二个元素 - 类型代码 -

None
是一个错误。事实上,它被报告为bug,但作为另一个bug报告的重复而关闭,而该报告又被Gerhard Häring(链接)关闭为“无法修复”:

无法保证 SQlite 结果集中的所有列始终具有相同的类型。这就是为什么我决定将类型代码设置为“未定义”。

SQLite 的

灵活类型 就是该决议所指的内容,可以通过插入一些来自 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
    

0
投票
这就是我只有专栏的方式

table_columns = [x[0] for x in con.execute('select * from table').description ]
其中 con 是我的连接。


0
投票
我不确定sqlite,但对于mariadb连接器,如果结果集为空并且

cursor.description

None
[]
,但你想要列名,你可以尝试使用以下命令再次执行查询
LIMIT
子句设置为
0
,这将返回带有列名称的空结果集。

import mysql.connector # Connect to the database cnx = mysql.connector.connect(user='your_username', password='your_password', host='your_host', database='your_database') cursor = cnx.cursor() # Execute the query query = (""" SELECT column1, column2, column3 FROM your_table WHERE some_condition """) cursor.execute(query) # Fetch all rows (which will be none) rows = cursor.fetchall() # If result set is empty, re-run the query plan # with LIMIT 0 to get column names if len(rows) == 0 or not cursor.description: cursor.execute(query + " LIMIT 0") # Get the column names from the cursor description column_names = [col[0] for col in cursor.description]
    
© www.soinside.com 2019 - 2024. All rights reserved.