目录

一、背景

二、查因

三、总结

附:参考帖子


一、背景

拉取tushare财经数据到本地,再转换入数据库。

建表遇到这个报错:DataError (1265, Data truncated for column 'num' at row 1)

时间:20201216

部分执行代码如下:

db = pymysql.connect(host,user,password,database)#获取游标对象
cursor = db.cursor()#创建数据库,如果数据库已经存在,注意主键不要重复,否则出错
try:cursor.execute('create table catering_sale(num varchar primary key,date datetime, sale varchar')
except:print('数据库已存在!')#插入数据语句
query = """insert into catering_sale (num, date, sale) values (%s,%s,%s)"""#迭代读取每行数据
#values中元素有个类型的强制转换,否则会出错的
#应该会有其他更合适的方式,可以进一步了解
for r in range(0, len(data)):num = data.ix[r,0]date = data.ix[r,1]sale = data.ix[r,2]values = (str(num), str(date), str(sale))cursor.execute(query, values)#关闭游标,提交,关闭数据库连接
#如果没有这些关闭操作,执行后在数据库中查看不到数据
cursor.close()
db.commit()
db.close()

数据样例如下:

二、查因

参考某帖子把varchar(32)改成varchar(50)后即执行成功的例子,我尝试“cursor.execute('create table catering_sale(num varchar primary key,date datetime, sale varchar') ”

中的数据类型 varchar 改成varchar(100),把datetime改成varchar等,仍然提示同样的报错。

#创建数据库,如果数据库已经存在,注意主键不要重复,否则出错
try:
#     cursor.execute('create table catering_sale(num int primary key,date datetime, sale float')
#     cursor.execute('create table catering_sale(num varchar(100) primary key,date datetime, sale varchar(100))')
#     cursor.execute('create table catering_sale(num varchar(100) primary key,date varchar(100), sale varchar(100)')cursor.execute('create table catering_sale(num varchar primary key,date varchar, sale varchar')
except:print('数据库已存在!')

看到提示“数据库已存在!”,突然想起原表已存在的情况下,重新建表是建不进去的,自然数据类型也是保持一开始的“num int primary key,date datetime, sale float”。

于是去数据库把删了先。删完之后再运行,报错变成了:

ProgrammingError: (1146, "Table 'quant_invest.catering_sale' doesn't exist")

后来查因,去数据库看了也没表catering_sale存在。原来是建表语句中漏了右括号,导致没有建表成功。加上右括号后(如下语句),执行成功没有报错,但是去数据库查看,还是没有表catering_sale,这就尴尬了。

#创建数据库,如果数据库已经存在,注意主键不要重复,否则出错
try:
#     cursor.execute('create table catering_sale(num int primary key,date datetime, sale float )')
#     cursor.execute('create table catering_sale(num varchar(100) primary key,date datetime, sale varchar(100))')
#     cursor.execute('create table catering_sale(num varchar(100) primary key,date varchar(100), sale varchar(100))')cursor.execute('create table catering_sale(num varchar(100) primary key,date varchar(100), sale varchar(100) )')
except:print('数据库/表?已存在!')

同时,发现另一个小问题,就是,原语句的 ix 不推荐使用,转为用新函数.loc和.iloc了。

D:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:38: FutureWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

将 ix 改成 iloc后,报了另一个新的error:IntegrityError: (1062, "Duplicate entry '801001.SI' for key 'PRIMARY'")。

for r in range(0, len(data)):num = data.iloc[r,0]date = data.iloc[r,1]sale = data.iloc[r,2]values = (str(num), str(date), str(sale))cursor.execute(query, values)

猜测应该是数据表里的主键重复,'801001.SI' 可能出现了2次以上。

然而'801001.SI',count了一下,只有1次(如下图)。

既然提示主键重复,而查了原Excel表'801001.SI' 又没重复。那先在数据库删掉刚刚新建的数据库表catering_sale,再重新运行一遍。这次成功了。

至此,大功告成,可以把剩余的字段补齐,把数据库表名修改合适,做真正的数据入库操作了。

三、总结

这次主要问题有两个:

1、数据类型要正确。varchar是文本类型,目前看,还不需要对数据做专题应用,而只是需要模拟入库的时候,varchar基本通用各种数据内容。所以在这次尝试里就先全部改成varchar了,省心。

2、python的旧函数 ix 需要变更成新函数 iloc。

另外有些小问题,就是运行一次建了表之后,会影响之后的代码运行(无法重复建表和入库)。所以每次尝试,都应该回到数据库前端页面把建好的表删掉。

当然,后续熟悉了之后,以及要配置自动调度的时候,可以将数据库删表操作写入python代码,就不用每次都要回到前端页面删表了。

附最终全部代码:

# 定义文件路径/所在文件夹
path = 'D:\WPS Cloud Files\Python_Efficiency\Python_Quant_Investment\本期财经数据列表合集2020-10-11'#导入需要使用到的数据模块
import pandas as pd
import pymysql#读入数据
filepath = path + r'\指数基础信息列表_SW2020-10-11.xlsx'
data = pd.read_excel(filepath)
data.head()#建立数据库连接
host='localhost'  #“你的数据库地址”
user='root'  #“用户名”
password='root'  #“密码”
database='quant_invest'  #“数据库名”
charset='utf8'db = pymysql.connect(host,user,password,database)#获取游标对象
cursor = db.cursor()#创建数据库,如果数据库已经存在,注意主键不要重复,否则出错
try:
#     cursor.execute('create table catering_sale(num int primary key,date datetime, sale float )')
#     cursor.execute('create table catering_sale(num varchar(100) primary key,date datetime, sale varchar(100))')
#     cursor.execute('create table catering_sale(num varchar(100) primary key,date varchar(100), sale varchar(100))')cursor.execute('create table catering_sale(num varchar(100) primary key,date varchar(100), sale varchar(100) )')
except:print('数据库/表?已存在!')#插入数据语句
query = """insert into catering_sale (num, date, sale) values (%s,%s,%s)"""#迭代读取每行数据
#values中元素有个类型的强制转换,否则会出错的
#应该会有其他更合适的方式,可以进一步了解
for r in range(0, len(data)):num = data.iloc[r,0]date = data.iloc[r,1]sale = data.iloc[r,2]values = (str(num), str(date), str(sale))cursor.execute(query, values)#关闭游标,提交,关闭数据库连接
#如果没有这些关闭操作,执行后在数据库中查看不到数据
cursor.close()
db.commit()
db.close()#重新建立数据库连接
db = pymysql.connect(host,user,password,database)
cursor = db.cursor()
#查询数据库并打印内容
cursor.execute('''select * from catering_sale''')
results = cursor.fetchall()
for row in results:print(row)
#关闭
cursor.close()
db.commit()
db.close()

附:参考帖子

1、Warning(1265)Data truncated for column 'v_mmi' at row 1 ——把varchar(32)改成varchar(50)后即执行成功

https://blog.csdn.net/zm2714/article/details/7950081?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8.control

2、导入数据到数据库出现data truncated for column 错误

https://blog.csdn.net/mzc186/article/details/78057999?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.control

在本地环境wamp上都没有问题,但在服务器端导入的时候就出现这样的问题,几经周折,最后发现是由于导入数据库的工具软件本身依赖于php环境,而服务器端默认的upload_max_filsesize是2M,而我的sql文件大于2M,因而出现溢出.同理,mysql的my.ini配置文件中也有一个max_allowed_packet配置项,默认是16M,所以如果没有修改默认的这个配置项而你要导入的sql文件大于16M的话,就又可能出现上述类似的数据导入错误.

3、Python报错:pymysql.err.IntegrityError: (1062, “Duplicate entry ‘1‘ for key ‘PRIMARY‘“)

https://blog.csdn.net/zkw_1998/article/details/105459733

错误原因:数据库表里有数据 因为我开始在数据库的表里写了几条数据,后面发现数据太多了,就不想写了。想把excel表里的数据导进去,但是写了的那几条数据没删,就报错了。

解决方法:把数据库表里的数据删掉

4、使用Python将数据插入数据库(一)

https://www.cnblogs.com/dennis-liucd/p/7265641.html

【已解决】python pymysql报错DataError (1265, Data truncated for column ‘num‘ at row 1)相关推荐

  1. 用Python将excel数据插入到MySQL报错(1265, Data truncated for column ‘num‘ at row 1)

    作为一个小白,这是第一篇帖子. 希望记录自己一路走来遇到的问题,也希望大佬指正. 一.背景: 用Python将数据逐行插入到MySQL. 二.问题: 但在python运行时发现总是报错(1265, D ...

  2. pymysql 插入错误:Warning(1265, “Data truncated for column ‘XXXX‘ at row xxx“)

    问题 最近用python使用pymysql插入数据时,报错了,我一口气插入了2W条数据,在中间报错了,如下图: 报错打印如下: Warning(1265, "Data truncated f ...

  3. > 1265 - Data truncated for column ‘telephonenumber‘ at row 1

    案例 insert into lm_product_supply_price (telephonenumber) values ("86 0769 83002690") telep ...

  4. MYsql的enum字段报错row,SQLSTATE[01000]: Warning: 1265 Data truncated for column at row 1错误代码解决方法

    SQLSTATE[01000]: Warning: 1265 Data truncated for column 'status' at row 1 因为enum类型只支持数字型数据,而且出错率高,尤 ...

  5. Error Code: 1265. Data truncated for column

    Error Code: 1265. Data truncated for column 'cust_type_cd' at row 1 column 'cust_type_cd'  字段类型跟表中字段 ...

  6. Mysql ERROR 1265 (01000): Data truncated for column ‘XXX‘ at row X

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 报错: ERROR 1265 (01000): Data truncated for column 'name' at row 520 解决方 ...

  7. #1265 - Data truncated for column

    mysql执行报 #1265 - Data truncated for column错误 是因为报错的字段的字节个数或者类型不正确

  8. 解决json解析报错:Expecting value: line 1 column 1 (char 0)

    一般来说,出现这种Expecting value: line 1 column 1 (char 0)报错,一般原因都是返回的数据的格式不是json格式的. 今天在用flask写一个接口,测试接口的时候 ...

  9. Python: pymysql报错ModuleNotFoundError: No module named ‘pymysql‘等没有*模块问题

    背景很简单,执行的python文件中有导入pymysql 问题 在vscode中执行文件报错: ModuleNotFoundError: No module named 'pymysql' Modul ...

最新文章

  1. 批处理技巧:循环固定目录的子目录,然后向每个子目录拷贝文件
  2. [SOSP 17] Wukong+S : 不断演化的RDF数据的亚毫秒级别的状态流查询
  3. phpwind 8.7 发布主题 分析
  4. PHP代码在线格式化美化工具
  5. golang websocket conn.close关闭错误_Websockets 与在golang中的应用
  6. 深度学习与TensorFlow:FCN论文学习笔记
  7. 95-080-054-源码-启动-启动TaskManager
  8. python 计算机程序设计-计算机程序设计(Python)
  9. VS2017开发.net core 时默认发布路径文件夹多个BPC
  10. 查看和修改MySQL数据库表存储引擎
  11. 如何绘制高质量业务流程图
  12. 控制台命令调试(bt)
  13. QQ空间官方账号被黑产利用漏洞分析
  14. 天正菜单栏不见了怎么显示出来_天正建筑菜单栏不见了怎么调出来
  15. 1.点亮一个LED灯
  16. 用 TensorFlow 做个聊天机器人
  17. 《14天动手学深度学习》——语言模型
  18. 华为服务器显示100错误,华为12708风扇狂转100%故障排除
  19. 力扣 面试题 10.11. 峰与谷
  20. 创建Firefox扩展

热门文章

  1. 任意椭圆和直线求交点方程组解析
  2. STM32下载中出现Flash Download failed - Target DLL has been cancelled报错
  3. 2017淘宝嘉年华群聊玩法出炉
  4. windows中删除设备和驱动器中的其他软件图标
  5. 腾讯逆地址解析php,腾讯地图逆地址解析,通过经纬度获取详细的信息数据
  6. anaconda利用pip安装module
  7. 超实用后台UI模板有这些就够了!(一)
  8. poi-tl实现word文档按模板下载
  9. 志愿者管理系统 php,志愿者信息管理系统
  10. python 矩阵化为最简阶梯型