我在 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 可以清楚地看出,每个元组的前两个元素是必需的。但这不适合我。为什么?
另外,我应该在表中进行哪些更改才能获取设置为“无”的其他元素的值?
DB API2.0 的 sqlite3 仅保证第一项。
它为每列返回一个 7 元组,其中每列的最后 6 项 元组没有。
https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.description
要打印所有详细信息,我想您应该有一些数据。 可能会添加一些数据并执行选择语句
显然 type_code 在 sqllite 3 上返回为 None 是一个错误,请参阅链接了解更多详细信息。
这是一种方法。仍在原始代码中使用
cursor.description
。
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)
# column names
col_desc = []
columns = c.description
for column in columns:
col_desc.append(column[0])
print(col_desc)
database
并执行该函数import student
students.show_all()
在他们的 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
table_columns = [x[0] for x in con.execute('select * from table').description ]
其中 con 是我的连接。
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]