gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:49 25 4
gpt4 key购买 nike

我目前正在上一门数据库类(class),其中一个实验室问题让我困惑于如何实现上述内容,事实上,如果可能的话。我试过搜索 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)

最佳答案

如果 block 内引发异常,事务会自动回滚。因此,您只需要为自己创建一个小的异常类,在 block 内引发一个,然后安排拯救它,这样您的程序就不会因为引发的异常而错误退出。

尝试这样的事情:

class MyLittleIdError < StandardError
end

begin
@conn.transaction do |conn|
ins = conn.exec_prepared('insert', [i, "#{@words1[i % 100]} street"])
raise MyLittleIdError if (ins[0]['id'].to_i % 2) == 0
end
rescue MyLittleIdError
puts "aha! we have rolled back."
end

关于ruby - 如何使用 PG Ruby Gem 有条件地回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20051912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com