【问题标题】:How to add multiple columns in Sequel如何在Sql中添加多列
【发布时间】:2020-02-29 09:19:51
【问题描述】:

在这个例子中:

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"

但我无法在续集中的一行中提出相同的想法:

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

返回错误:

undefined method '+' for :unfollows:Symbol

我发现的唯一方法是:

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

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

【问题讨论】:

  • 请查看“How to Ask”以及链接页面和“mcve”。我们需要查看一个演示您所遇到问题的最小代码示例。
  • 我很抱歉——但我认为这就是我包含的代码示例的作用?过去我的问题从来没有遇到过问题,而且我不确定我应该在这里做些什么不同的事情。谢谢。
  • 请注意,在 mcve 文档中,该代码必须是演示问题的最小可运行代码。虽然 sn-ps 经常被使用,人们围绕它编写各种代码只是为了测试和尝试提供帮助,但这对网站没有帮助。你的代码应该创建一个简单的数据库,用一些数据填充它,显示它是如何工作的和不工作的。
  • 您尝试添加两个符号:apples + :oranges,因此出现错误。它适用于 SQLite3 SQL 查询,因为您将其发送到 DBM,它知道 applesoranges 是列。 update 语句需要知道值是什么,因此您的最后一个示例有效,因为值是由前两行检索的。打开日志记录,Sequel 将在与 DBM 对话时准确地向您展示它正在尝试做什么。 sequel.jeremyevans.net/rdoc/files/doc/…
  • 很好的变化。定义一个用于演示您遇到的问题的测试套件并不难,并且该过程通常会揭示问题所在,或者提出解决方法。

标签: ruby sqlite sequel


【解决方案1】:

我强烈建议阅读续集cheat sheetREADME,然后阅读不同课程的文档。它非常强大,在我看来,它是一个很棒的 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 可以让我们逐步构建语句。我指向一条记录,然后可以以不同的方式重用该变量。这真的很强大,并在文档中进行了介绍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多