2010-07-16 69 views
0

由于我的应用程序的性质,我需要支持将大量数据快速插入数据库。使用executemany()会提高性能,但有一点需要注意。例如,MySQL有一个名为max_allowed_pa​​cket的配置参数,如果我的插入查询的总大小超过了它的值,MySQL将引发错误。SQLAlchemy和max_allowed_pa​​cket问题

问题#1:有没有办法告诉SQLAlchemy将数据包拆分成几个较小的数据包?
问题#2:如果其他RDBS有类似的约束,我该如何解决它们呢?



P.S.我早些时候发布了这个问题,但是当我错误地认为我可能不会遇到这个问题时将其删除。可悲的是,事实并非如此。

回答

1

我最近有一个类似的问题和所使用的 - 不是很优雅 - 解决方法:

  • 首先,我分析的my.cnf的值max_allow_packets,如果我不能找到它时,最大值被设置为默认值。
  • 所有数据项都存储在一个列表中。
  • 接下来,对于每个数据项,我数着近似的字节长度(以字符串,它以字节字符串的长度,因为我需要使用是安全的最大字节数等数据类型。)
  • 我把它们相加,我达到了约。 max_allow_packets的75%(因为SQL查询也会占用空间,只是为了安全起见)。

这种方法不是很漂亮,但它对我来说工作得非常完美。

+0

听起来不错,虽然有两个细微差别。首先,max_allowed_pa​​cket值可能是由DBA发布的命令设置的,而不是配置文件中的,所以我认为我宁愿做一个“select @@ max_allowed_pa​​cket”来代替。其次,你知道像Postgres或Oracle这样的其他数据库是否需要类似的解决方法? – dpq 2010-07-26 11:22:34

+0

你说得对,''select''语句是正确的做法。和Postgres或Oracle一样,我对这些数据库没有任何经验,但是一个快速的谷歌搜索产生了http://www.mail-archive.com/[email protected]/msg71116.html,所以我假设至少Postgres没有这个限制,但我可能是错的。 – PhilS 2010-07-26 14:52:11

相关问题