2012-05-03 22 views
7

使用Sequel可以在单个呼叫中进行多次更新吗?例如,在我的服务器上进行大约200次更新可能需要几分钟的时间,但是如果我伪造一个SQL查询,它将在几秒钟内运行。我想知道Sequel是否可以用来伪造这个SQL查询,甚至更好,整个操作本身就是一个镜头。是否有可能在Sequel中批量更新?

+1

是的,但它取决于你试图做什么,以及什么RDBMS你正在运行的。请提供更多信息,以便我们能够更好地为您提供建议。 –

+0

我正在使用PostgreSQL,并且我希望Sequel针对多个更新发出单个查询,因为我可以在普通SQL中执行此查询。 – RooSoft

回答

3

我遇到的解决方案涉及update_sql方法。它不是执行操作本身,而是输出原始SQL查询。要批量多个更新,只需将它们加入;在两者之间,使用结果字符串调用run方法,并且全部设置完成。

批处理解决方案比多个更新更快。

+1

这个解决方案只比'多个更新'更快,因为你只为整个更新集合建立一个实际的连接/访问数据库,而不是每个更新。请注意,有些框架会自动执行这种行为 - 它们会在内存中保存更新,直到事务提交。此外,如果可以将多个语句重新写入_one_语句,您可能会获得更大的收益。 –

+2

这可能适用于您的情况,但并非所有Sequel适配器都支持Database#run中的多个查询。续集实际上并没有提供一个独立于适配器的方法,它接受单个字符串中的多个查询(一些适配器可以处理这样的字符串,而另一些则不能)。 –

+1

对于mysql2驱动程序,连接时必须使用{flags::: Mysql2 :: Client :: MULTI_STATEMENTS}作为选项 – tothemario

5

可以使用Datset#importhttp://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-import “插入多个记录到相关联的表中。该方法可用于有效地插入大量记录到表在单个查询数据库是否支持它。插页自动包裹在交易“。

这里有一个如何使用它的例子:

DB = Sequel.connect(...) 
DB[:movies].import([:id, :director, :title, :year], [[1, "Orson Welles", "Citizen Kane", 1941],[2, "Robert Wiene", "Cabinet of Dr. Caligari, The", 1920]]) 
相关问题