【发布时间】:2016-05-10 10:06:47
【问题描述】:
所以我有一个 python 脚本,它遍历大约 350,000 个数据对象,并且根据一些测试,它需要更新代表 MySQl db 中每个对象的行。我也在使用 pymysql,因为我遇到的麻烦最少,尤其是在发送大型选择查询时(带有 where column IN (....) 子句的选择语句可以包含 100,000+ 个值)。
由于每行的每次更新都可能不同,因此每个更新语句都是不同的。例如,对于某一行,我们可能想要更新 first_name,但对于另一行,我们希望保持 first_name 不变,我们想要更新 last_name。
这就是我不想使用cursor.executemany() 方法的原因,该方法接受一个通用更新语句,然后将值提供给它,但是正如我所提到的,每次更新都是不同的,因此拥有一个通用更新语句不会真的很适合我的情况。我也不想通过网络单独发送超过 350,000 条更新语句。无论如何,我可以将所有更新语句打包在一起并立即发送吗?
我尝试将它们全部放在一个查询中并使用cursor.execute() 方法,但它似乎并没有更新所有行。
【问题讨论】:
-
有多少种不同的更新?即,您使用百万分之三的值更新了多少个不同的表?这些表上有多少不同的列?即它只是几个不同的更新语句吗?
-
除了“一个查询”或“百万分之一”查询之外,还有其他有用的选项吗?如果数据被加载到数据库中的
work table并从中进行操作呢?数据库喜欢玩表中的数据? -
@RyanVincent 他们都只是更新同一个表,但是该表有 12 列,每个更新语句可以一次更新任何不同的列组合,从 1 列到 10 列。
-
您能否编写更新语句以使用新值或现有值更新任何列?这会给您一种处理新值的方法吗?
-
这取决于测试及其复杂程度。您可以通过拆分每个测试来为每列编写 1 个大语句或 10、1 个 .. 或更多。可以分享一下测试吗?在一个表中以这种行依赖的方式定期更新 350,000 行也很奇怪!也许可以使用不同的数据库结构?