微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySql Python 连接器将 INT 转换为 int64,但不再返回?

如何解决MySql Python 连接器将 INT 转换为 int64,但不再返回?

我正在使用 MysqL Python 连接器来操作数据库,但是当我的查询涉及 INT 数据库类型时遇到了问题。当 MysqL数据库中检索一个 INT 列时,它似乎转换为 Python int64。这很好,除了它不会将其转换回为可用的 MysqL 类型。

这是一个简化的例子:

这是我用于表“test”的 MysqL 架构,其中 Id 为数据类型 INT:

enter image description here

enter image description here

我的 Python 代码如下。第二次执行(更新查询)失败,出现此异常:

Exception Thrown: Failed processing format-parameters; Python 'int64' cannot be converted to a MysqL type

如果我使用 int(firstId) 显式转换 'firstId' 参数(报告为类型 ),代码将成功运行:as per another SO answer。我可能天真地认为,如果 MysqL一个方向管理转换,它会在另一个方向管理它。事实上,我不一定知道我从实际查询中得到的类型(我使用的是 Python ......我不应该知道)。这是否意味着我必须在运行 MysqL 查询之前对所有 Python 变量进行类型检查?

我尝试将表列数据类型从 INT 更改为 BIGINT(64 位 INT),但我遇到了相同的转换错误。我正在使用的 MysqL 连接器包 (mysql-connector-python 8.0.23) 上是否可能存在 32 位/64 位不匹配?

import MysqL.connector as msc
import pandas as pd

def main():
    dbConn = msc.connect(user='********',password='********',host='127.0.0.1',database='********')
    #Open a cursor
    cursor = dbConn.cursor()
    #Find Id of given name
    cursor.execute('SELECT * from test WHERE Name = %s',['Hector'])
    headers = cursor.column_names
    queryVals = list()

    for row in cursor:
            queryVals.append(row)
        
    cursor.close()   
    dfQueryResult = pd.DataFrame(queryVals,columns = headers)
    
    print(dfQueryResult)

    #Change name 
    firstId = dfQueryResult['Id'].iloc[0]
    print('firstId is of type: ',type(firstId))

    cursor = dbConn.cursor()
    cursor.execute('UPDATE test SET Name =%s WHERE Id =%s',['Graham',firstId]) #This line gives the error
    print(cursor.rowcount,' rows updated')
        
    cursor.close()   

    dbConn.commit()
    dbConn.close()

main()

解决方法

首先,感谢@NonoLondon 的评论和调查工作。

Pandas Dataframe 使用 NumPy 类型存储数字。在这种情况下,DataFrame 构造函数从 MySql 返回中获取 Python 'int' 并将其转换为 Numpy.int64 对象。当 MySql 再次使用此变量时,连接器无法将 Numpy.int64 转换回直接的 Python 'int'。

从其他 SO 文章中,我发现了适用于所有 Numpy 数据类型的 item() 方法,该方法可转换为基本 Python 类型。由于所有 Numpy 数据类型都是从基类 Numpy.generic 派生的,所以我现在在从 DataFrames 中提取变量时使用以下实用函数:

import numpy as np

def pyTypeFromNp(val):
    if isinstance(val,np.generic):
        return val.item()

    return val

因此修改后的行现在是:

firstId = pyTypeFromNp(dfQueryResult['Id'].iloc[0])

并且代码按预期运行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。