pandas.DataFrame.to_sql写入Mysql报错1170
发布网友
发布时间:2024-10-04 06:36
我来回答
共1个回答
热心网友
时间:2024-11-30 16:40
今天在使用pandas.DataFrame.to_sql接口,将tushare获取的一个df写入mysql时,遇到了报错。
报错信息是:PGM:writedb:write_records_into_mysql:error: (_mysql_exceptions.OperationalError) (1170, "BLOB/TEXT column 'code' used in key specification without a key length") [SQL: u'CREATE INDEX ix_k_data_code ON k_data (code)'] (Background on this error at: sqlalche.me/e/e3q8)
这个错误在创建Mysql表时很常见,主要是因为键值字段是变长的BLOB或TEXT类型,导致Mysql引擎无法生成索引。
尽管我尝试了各种方法,但问题仍然没有解决,这让我感到非常困扰。半年前的代码,核心程序没有变化,但现在重构一下,却无法正常运行。
不过,我还是决定将这个报错记录下来。最近我正在重构半年前写的股票程序,计划整理成一个标准的Python包。其中,write_records_into_mysql函数是所有程序写入Mysql的接口,它有两个必输参数,分别是df和table_name;三个默认参数,分别是conn、if_exists、dtype。
这个函数主要作用是调用pandas.DataFrame.to_sql接口,将df写入Mysql。虽然看起来存在重复封装,但为什么还要调用write_records_into_mysql呢?这是一个好问题。
主调函数中,核心代码块在一个循环体里,传入stock_code和issue_date两个参数,调用tushare的API获取个股日K线数据。
如果获取成功,将返回的df存入Mysql;如果获取失败,则使用continue语句跳出本次循环,处理下一只股票的数据。
为了帮助大家理解Pandas和Dataframe,我举一个例子。在REPL中引入tushare包,获取个股"002930"日K线数据,可以看到df的索引和栏位。
在重构的程序中,我取到k_data_by_code数据后,做了以下几步操作:将索引转换成列'seq',使用set_index函数设置新的索引,插入stock_name,定义字典变量dict_k_data,最后调用write_records_into_mysql函数将df写入Mysql。
尽管我使用dtype={'code':VARCHAR(k_data_by_code.index.get_level_values('code').str.len().max())}来调用write_records_into_mysql函数,但仍然报同样的错。
我不明白为什么同样的代码半年前可以成功,而现在就不行。