如何在 Sequel 中添加多列

How to add multiple columns in Sequel

在这个例子中:

require 'rubygems'
require 'sqlite3'
require 'sequel'

db = SQLite3::Database.new "fruits.db"
db2 = Sequel.sqlite("fruits.db")

db.execute 'CREATE TABLE "fruit" ("box_id" INTEGER, "apples" INTEGER, "oranges" INTEGER, "total" INTEGER)'

db.execute "INSERT INTO fruit(box_id,apples,oranges) VALUES(1,2,2)"

thisBox = db2[:fruit][:box_id => 1] 

这适用于 SQLite3:

db.execute "UPDATE fruit SET total = apples + oranges WHERE box_id=1"

但我无法在 Sequel 的一行中提出相同的内容:

thisBox.update(:total => :apples + :oranges)

哪个returns错误:

undefined method '+' for :unfollows:Symbol

我发现的唯一解决方法是:

apples = thisBox[:apples]
oranges = thisBox[:oranges]

thisBox.update(:total => apples + oranges)

我强烈建议通读 Sequel cheat sheet, README,然后阅读不同 类 的文档。它非常强大,在我看来,它是一个很棒的 ORM。

以此为起点思考如何学习它。它还将显示一种简单但不是最有效的方法来完成您所询问的事情:

require 'sequel'

require 'logger'
DB = Sequel.sqlite(loggers: [Logger.new($stdout)])

DB.create_table :fruitbaskets do
  primary_key :id
  Integer :apple
  Integer :orange
  Integer :total
end

fruitbaskets = DB[:fruitbaskets]
fruitbaskets.insert(:apple => 1, :orange => 2, :total => 0)

fruit_basket = fruitbaskets.where(:id => 1)

fruit_basket.update(:total => fruit_basket.get([:apple, :orange]).sum) 

fruitbaskets.where(:id => 1).get([:apple, :orange, :total]) # => [1, 2, 3]
# >> I, [2019-11-04T19:30:20.524611 #8709]  INFO -- : (0.000188s) PRAGMA foreign_keys = 1
# >> I, [2019-11-04T19:30:20.524673 #8709]  INFO -- : (0.000013s) PRAGMA case_sensitive_like = 1
# >> I, [2019-11-04T19:30:20.525058 #8709]  INFO -- : (0.000228s) CREATE TABLE `fruitbaskets` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `apple` integer, `orange` integer, `total` integer)
# >> I, [2019-11-04T19:30:20.525212 #8709]  INFO -- : (0.000060s) SELECT sqlite_version()
# >> I, [2019-11-04T19:30:20.525331 #8709]  INFO -- : (0.000036s) INSERT INTO `fruitbaskets` (`apple`, `orange`, `total`) VALUES (1, 2, 0)
# >> I, [2019-11-04T19:30:20.525477 #8709]  INFO -- : (0.000040s) SELECT `apple`, `orange` FROM `fruitbaskets` WHERE (`id` = 1) LIMIT 1
# >> I, [2019-11-04T19:30:20.525558 #8709]  INFO -- : (0.000023s) UPDATE `fruitbaskets` SET `total` = 3 WHERE (`id` = 1)
# >> I, [2019-11-04T19:30:20.525669 #8709]  INFO -- : (0.000037s) SELECT `apple`, `orange`, `total` FROM `fruitbaskets` WHERE (`id` = 1) LIMIT 1

注:

fruit_basket = fruitbaskets.where(:id => 1)

fruit_basket.update(:total => fruit_basket.get([:apple, :orange]).sum) 

Sequel 如果对我们的代码有用,我们可以增量构建语句。我指向一条记录,然后可以以不同的方式重用该变量。这真的很强大,在文档中有介绍。