作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想设置 postgres statement_timeout
对于个人迁移。我似乎无法做到这一点。这是我的实验:
def change
execute <<~SQL
SET LOCAL statement_timeout = 1; -- ms
-- this does not cause a timeout which is expected, because pg
-- only applies the timeout to the next protocol message / statement,
-- and rails sends everthing inside execute in the same statement
select pg_sleep(1); -- seconds
SQL
# if uncommented, this DOES cause a timeout, which is expected
# execute <<~SQL
# select pg_sleep(1); -- seconds
# SQL
# this does not cause a timeout, which is unexpected
remove_column :foos, :bar
# we do get here, which is unexpected
raise "we finished"
end
最佳答案
我假设您的问题是关于设置 statement_timeout
用于迁移中的单个语句(不适用于单个迁移)。
您可以通过使用 Postgres’s SET
instead of SET LOCAL
来实现这一点。 .
class SomeMigration < ActiveRecord::Migration[6.0]
# Disables BEGIN/COMMIT around migration. SET LOCAL will have no effect.
disable_ddl_transaction!
def change
# Applies to the current database session, until changed or reset.
execute <<~SQL
SET statement_timeout = '1s';
SQL
# Will raise `ActiveRecord::QueryCanceled`.
execute <<~SQL
SELECT pg_sleep(2);
SQL
# Resets (disables) timeout.
execute <<~SQL
SET statement_timeout = DEFAULT;
SQL
# Will not raise.
execute <<~SQL
SELECT pg_sleep(2);
SQL
end
end
SET LOCAL
如果你不打电话
disable_ddl_transaction!
.两者结合不起作用,因为
SET LOCAL
在事务块之外没有任何影响。它记录:
WARNING: SET LOCAL can only be used in transaction blocks
disable_ddl_transaction!
会提出
NoMethodError
.应该在
def change
之前定义。
关于ruby-on-rails - 如何为单个迁移设置 statement_timeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62161436/
我是一名优秀的程序员,十分优秀!