使用pymysql将mysql表替换为python中的数据框时行大小太大
Posted
技术标签:
【中文标题】使用pymysql将mysql表替换为python中的数据框时行大小太大【英文标题】:Row size is too large while replacing mysql table with dataframe from python using pymysql 【发布时间】:2021-06-08 01:32:46 【问题描述】:我正在使用 pymysql to_sql 函数从 python 向 mysql 写入表。 我有 1000 行 200 列。
连接mysql的查询如下:
engine = create_engine("mysql://hostname:password#@localhostname/dbname")
conn = engine.connect()
writing query: df.to_sql('data'.lower(),schema=schema,conn,'replace',index=False)
我遇到以下错误:
OperationalError: (pymysql.err.OperationalError) (1118, 'Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.')
我已将列 dtypes 更改为字符串,但仍然出现错误。请帮我解决这个错误。
我正在尝试保存如下表。在这里,我提供了几列
创建表查询。我在保存时创建表时出错。
CREATE TABLE dbname.table name(
08:00:00
文字,
08:08:00
文字,
08:16:00
文字,
08:24:00
文字,
08:32:00
文字,
08:40:00
文字,
08:48:00
文字,
08:56:00
文字,
09:04:00
文字,
09:12:00
文字,
09:20:00
文字,
09:28:00
文字)
【问题讨论】:
请给出最小可行的代码。减少您的问题以显示仍然导致错误的示例。显示您尝试存储的 pandas 数据框df
和 schema
,至少在表 data
中。
to_sql
方法不是来自pymysql
。它是来自 pandas 的数据框对象的一种方法。 pandas.pydata.org/docs/reference/api/…
@Bennett Brown,好的,我会发布数据
percona.com/blog/2011/04/07/innodb-row-size-limitation。这包含许多针对您的问题的解决方案。特别是压缩的值得一看。由于数据量大,在我的最后重现这一点有点困难,否则我会尝试提供代码解决方案。
@BennettBrown,我提供了示例列
【参考方案1】:
错误不是由您的代码引起的。是你的Mysql服务器造成的
要解决问题,请更改 mysql 服务器的 my.ini 文本文件中的 innodb_log_file_size。
那么我相信这个错误会被修复。
innodb_log_file_size = 500M
innodb_log_buffer_size = 800M
innodb_strict_mode = 0
【讨论】:
,我在 my.ini 中搜索了 innodb_log_file_size 但在 Innodb 选项卡中没有找到该选项。 innodb_log_file_size 和 innodb_buffer_file_size 一样吗? 不,它们不一样,你可以在你的文件中添加 innodb_log_file_size = 500M 和 innodb_log_buffer_size = 800M .. 然后试试 我在设置这些值时出错。SET GLOBAL innodb_log_file_size = 500M;
错误:``` 变量 innodb_log_file_size 是只读变量```。 mysql中的错误代码1238
我相信您已经更改了 my.ini 文件中的值并重新启动了 mysql srvr。这是你做的还是你试图在 mysql cmd 中设置
我已在 server>Optionsfile>Innodbtab 中将 innodb_log_buffer_size 更改为 800M,并在 Server>Optionsfile>Innodb 选项卡中标记了复选框。我没有在 Innodb 选项卡中找到 innodb_log_file_size 所以我在查询选项卡中使用了 mysql 查询。我已经使用任务管理器重新启动了 mysql。【参考方案2】:
尝试在 my.cnf 中设置以下值并重新启动 mysqld。我希望这可以帮助你。 详情请参阅以下链接。
[mysqld]
max_allowed_packet = 1G
innodb_log_file_size = 2G
innodb_log_buffer_size = 512M
Helpful link
【讨论】:
以上是关于使用pymysql将mysql表替换为python中的数据框时行大小太大的主要内容,如果未能解决你的问题,请参考以下文章
48-mysql-Navicat数据库查询题目讲解(多表操作)python操作MySQLsql注入问题pymysql模块增删改查数据操作