pandas.DataFrame.to_sql写入Mysql报错1170

今天在使用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 i...
pandas.DataFrame.to_sql写入Mysql报错1170
今天在使用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函数,但仍然报同样的错。

我不明白为什么同样的代码半年前可以成功,而现在就不行。2024-08-12
mengvlog 阅读 7 次 更新于 2025-07-22 00:51:40 我来答关注问题0
  •  唔哩头条 如何在pandas中遍历dataframe的行?

    1. 遍历 Pandas DataFrame 的行是数据处理中的关键操作。2. 使用 DataFrame 的 index 属性可以遍历整个 DataFrame。3. 通过 index 属性,我们可以获得从顶行到底行的范围对象,然后使用这个范围对象迭代 DataFrame 的每行数据。4. 例如,我们可以通过循环访问 index 属性来实现遍历,代码如下:```python ...

  •  文暄生活科普 【python床头书系列】pandas.DataFrame.apply pandas.DataFrame.map用法示例权威详解区别

    在进行数据操作时,pandas.DataFrame 提供了 apply() 和 map() 两种方法,它们分别用于在 DataFrame 的轴上应用函数或对 DataFrame 的元素进行逐个处理。具体用法如下:DataFrame.apply 语法 该方法允许沿 DataFrame 的轴应用函数,传递给函数的对象是 Series 对象,其索引可以是 DataFrame 的索引或列。默认...

  •  文暄生活科普 Python pandas.DataFrame.where函数方法的使用

    例如,假设你有一个DataFrame,其中包含一些缺失值(NaN),你可以使用pandas.DataFrame.where方法将这些缺失值替换为特定值或计算后的值。具体用法如下:python df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [5, np.nan, np.nan, 8], 'C': [9, 10, 11, 12]})df = df.wh...

  •  文暄生活科普 创建Pandas DataFrame的6种方法

    1、创建空的Pandas DataFrame 首先,我们可以创建一个空的DataFrame,通过指定列名和行号。例如,下面的代码创建了一个3行3列的二维数据表,所有数据项都是NaN。2、手工创建Pandas DataFrame 接下来,我们可以通过使用pd.DataFrame手工创建一个Pandas数据帧。使用data参数声明数据,结果为默认列名为序号的数据...

  •  阿暄生活 pandas | DataFrame中的排序与汇总方法

    pandas DataFrame中的排序与汇总方法:排序: 根据索引排序: 使用sort_index方法。 可以指定axis参数来区分是按行索引排序还是按列索引排序。 使用ascending参数来指定排序顺序,默认为正序,倒序为False。根据值排序:使用sort_values方法。通过by参数传入希望排序参照的列名,可以是一列或多列。同样...

檬味博客在线解答立即免费咨询

报错相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部