如何使用PG Ruby Gem有条件地回滚事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用PG Ruby Gem有条件地回滚事务相关的知识,希望对你有一定的参考价值。

我目前正在上一门数据库课程,其中一个实验室问题使我难以理解如何实现以上所述,甚至可能的话。我尝试搜索docs,但是定义的交易方法相当模糊。

这是我第一次尝试在没有Rails的情况下进行任何数据库操作,所以我有些迷茫。我已经设法建立了到我的Postgresql数据库的连接并可以执行语句,我要做的最后一件事是基于简单条件回滚事务。

允许我向您显示代码:

require 'pg'
@conn = PG::Connection.open(:dbname => 'db_15_11_labs')
@conn.prepare('insert', 'INSERT INTO house (housenumber, street) VALUES ($1, $2) returning id')
@words = ["Foo", "Bar", "Bash", "Bang"]

def populate
  100.times.each_with_index do |i|
    # cycle through the @words array for street names, use i as house number
    ins = @conn.exec_prepared('insert', [i, "#@words1[i % 4] street"])
  end
end

[基本上,条件是如果返回的ID(ins[0]['id'])是偶数,则回滚事务。我认为如果ins[0]['id'] % 2 == 0我需要抛出某种异常,但是我该怎么做,更重要的是,如何将该信息编码为docs中给出的语法?

谢谢您的时间。

编辑1

我现在设法获取将条件放入定义的事务中的语法,如下所示:

@conn.transaction do |conn|
    ins = @conn.exec_prepared('insert', [i, "#@words1[i % 100] street"])
end

因此这个问题实际上变成了“ ins[0]['id'] % 2 == 0时我该如何引发并捕获异常”>

我尝试了一些有关引发异常的简单教程,但是请执行以下操作:

throw :id_exception if (@ins[0]['id'].to_i % 2) == 0
    catch :id_exception do
    puts "caught :id_exception #"
end

交易内部产生'throw': uncaught throw :id_exception (ArgumentError)

我目前正在上一门数据库课程,其中一个实验室问题使我难以理解如何实现以上所述,甚至可能的话。我尝试搜索文档,但是...

答案

如果块内引发异常,则事务自动回滚。因此,您只需要为自己创建一个Exception类,然后在块中引发一个Exception类,然后安排对其进行挽救,以使您的程序不会由于引发的异常而错误退出。

另一答案

您可以尝试将插入语句包装在ActiveRecord::Base.transaction中,然后在执行插入操作后,检查ins[0]['id']的值,如果它是偶数,则抛出回滚异常...在the documentation上检出ActiveRecord::Base.transaction

以上是关于如何使用PG Ruby Gem有条件地回滚事务的主要内容,如果未能解决你的问题,请参考以下文章

使用 ruby​​ pg gem 准备好的 INSERT 语句示例

Ruby 2.6.5 和 PostgreSQL pg-gem 分段错误

在 CentOS 6 上安装 pg gem

PG 事务提交与回滚

Ruby:如何写一个 gem? [关闭]

无法使用 Mavericks 在我的 Mac 上安装 PG gem