2010-07-16 72 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

相關問題