SQLAlchemy与max_allowed_packet问题
因为我的应用程序需要快速地将大量数据插入数据库,所以我需要找到合适的方法。使用executemany()可以提高性能,但有一个问题。比如说,MySQL有一个叫做max_allowed_packet的设置,如果我插入的查询总大小超过了这个值,MySQL就会报错。
问题 #1: 有没有办法让SQLAlchemy把数据包分成几个小的部分呢?
问题 #2: 如果其他关系型数据库也有类似的限制,我该怎么解决这个问题呢?
附注:我之前问过这个问题,但因为错误地认为自己不会遇到这个问题而删除了。可惜,事实并非如此。
1 个回答
2
我最近遇到了类似的问题,使用了一种不是很优雅的解决办法:
- 首先,我查看了my.cnf文件,找到了
max_allow_packets
的值。如果找不到,就用默认值。 - 然后,我把所有的数据项都存放在一个列表里。
- 接下来,对于每一个数据项,我计算它的大概字节长度(对于字符串,就是字符串的字节长度;对于其他数据类型,我取它们可能用到的最大字节数,以确保安全)。
- 我把这些字节长度加起来,当总和大约达到
max_allow_packets
的75%时就提交数据(因为SQL查询也会占用空间,所以这样做是为了保险)。
这个方法虽然不太好看,但对我来说效果很好。