panda pd.read_sql() 读取mysql 对于bigint 类型如果有空 自动转为float64 造成数据不一致问题

1 .发现问题:

我通过pd.read_sql()读取一张mysql表数据,然后把结果写入到另外一个相同表结构中后,发现有些数据不一样了。

分析原因:mysql表bigint类型字段可以为null的情况下,数据中有null,pd.read_sql()后会自动将bigint类型转为float64,从而导致精度丢失,再保存到其他地方就会导致数据不一致。

2.解决问题

开始的代码:(会导致数据不一致)

import pymysql
import pandas as pd
from sqlalchemy import create_engine

# 读取数据
conn1 = pymysql.connect(host='',port=3306, user="", password="",charset="utf8")
df = pd.read_sql("""select * from tablename""", conn1)

# 写入数据
conn2 = create_engine('mysql+pymysql://user:pwd@host:port/?charset=UTF8MB4')
dh_con = conn2.connect()

pd.io.sql.to_sql(df, 'tablename', dh_con, schema='db', if_exists='append',index=False)

修改后代码:

import pandas as pd
import pymysql
from sqlalchemy import create_engine

# 读取数据
conn1=pymysql.Connect(host="",
                      user="",
                      password="",
                      port=3306,
                      db="",
                      charset="utf8mb4")
cursor=conn1.cursor()


cursor.execute("""SELECT * FROM tablename""")
lis1=list(cursor.fetchall())

cursor.execute("""SHOW FULL COLUMNS FROM tablename""")                                         lis2=list(cursor.fetchall())

columns=[i[0] for i in lis2]
df = pd.DataFrame(lis1,columns=columns, dtype='object')

# 写入数据库
conn2 = create_engine('mysql+pymysql://user:pwd@host:port/?charset=UTF8MB4')
dh_con = conn2.connect()

pd.io.sql.to_sql(df, 'tablename', dh_con, schema='db', if_exists='append',index=False)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值