我有一个导入器,它获取电子邮件列表并将它们保存到 postgres 数据库中。这是无表导入器类中的一段代码:
query_temporary_table = "CREATE TEMPORARY TABLE subscriber_imports (email CHARACTER VARYING(255)) ON COMMIT DROP;"
query_copy = "COPY subscriber_imports(email) FROM STDIN WITH CSV;"
query_delete = "DELETE FROM subscriber_imports WHERE email IN (SELECT email FROM subscribers WHERE suppressed_at IS NOT NULL OR list_id = #{list.id}) RETURNING email;"
query_insert = "INSERT INTO subscribers(email, list_id, created_at, updated_at) SELECT email, #{list.id}, NOW(), NOW() FROM subscriber_imports RETURNING id;"
conn = ActiveRecord::Base.connection_pool.checkout
conn.transaction do
raw = conn.raw_connection
raw.exec(query_temporary_table)
raw.exec(query_copy)
CSV.read(csv.path, headers: true).each do |row|
raw.put_copy_data row['email']+"\n" unless row.nil?
end
raw.put_copy_end
while res = raw.get_result do; end # very important to do this after a copy
result_delete = raw.exec(query_delete)
result_insert = raw.exec(query_insert)
ActiveRecord::Base.connection_pool.checkin(conn)
{
deleted: result_delete.count,
inserted: result_insert.count,
updated: 0
}
end
我遇到的问题是,当我尝试上传时出现异常:
PG::ERROR: another command is already in progress: ROLLBACK
这一切都在一个动作中完成,我所做的唯一其他查询是用户验证,并且我有一个数据库互斥锁来防止重叠导入。这个查询一直运行良好,直到我的最新推送包括将我的 pg gem 从 0.13.2 更新到 0.14.1(以及其他“不相关”代码)。
该错误最初是在我们的登台服务器上开始的,但后来我能够在本地重现它并且没有想法。
如果我需要更清楚我的问题,请告诉我。
谢谢