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)