MySQL返回的数据类型和Python输出的类型在不同函数中不同

0 投票
2 回答
760 浏览
提问于 2025-04-18 03:41

我在用Python把MySQL的返回结果放进Qt表格时遇到了很多问题。我用的是 data = cursor.fetchall()

for data in data:
    for i in range(len(data)):
        sqlTableWidget.setItem(index,i,QtGui.QTableWidgetItem(data[i]))
    index = index +1

最开始我会把返回的结果用str()包裹起来,这样做除了在处理外语和日期时间时会有unicode问题之外,其他都能正常工作。所以现在我不再用str(),外语的内容可以正常插入表格了。不过,现在在处理非字符串类型时又出现了一些问题。

1) 我无法插入日期时间。当我用 type(data[i]) 检查时,它返回的是 datetime 类型。然后我想用 data[i] = data[i].strftime("%Y-%m-%d %H:%M:%S") 把它转换成字符串,但系统提示我 'tuple' object does not support item assignment,意思是说元组不支持这种赋值操作。

2) 所以我暂时就先不管这个问题了。现在我想显示整数。我执行了:

if data[i] == 1:
    print data[i]
    print type(data[i])
    data[i] = str(data[i])

结果是:

>>1
>>(type 'long')
>>Type Error: 'tuple' object does not support item assignment

另外,如果我尝试:

print list(data[i])

返回的是:

TypeError: 'long' object is not iterable

而且,

if data[i] is None:
    data[i] = 'No data'
sqlTableWidget.setItem(index,i,QtGui.QTableWidgetItem(data[i]))

返回:

QTableWidgetItem(QtableWidgetItem): argument 1 has unexpected type 'NoneType'

我感觉我对返回结果的理解可能有根本性的错误。是什么导致了这些问题呢?

2 个回答

1

根据你的错误日志,我觉得问题出在 Python 中的元组不支持赋值。

你获取的返回值是只读的元组,所以直接改变它的值是不合法的。

在你的代码中:

    data[i] = data[i].strftime("%Y-%m-%d %H:%M:%S")

你想直接修改存储在数据库中的原始数据吗?如果不想的话,你可以使用一个列表类型的变量,比如:

    my_list = data[i].strftime("%Y-%m-%d %H:%M:%S")
    // TODO MORE

否则,你可以依靠更新语句来修改数据库中的数据。

1

你不能直接修改从fetchall方法获取的数据,因为它是一个元组,而不是列表。最简单的解决办法是这样做:

data = [list(i) for i in cursor.fetchall()]

撰写回答