【问题标题】:Database using SQLite3 (Ruby) is not inserting使用 SQLite3 (Ruby) 的数据库未插入
【发布时间】:2017-02-10 22:52:24
【问题描述】:

我正在学习一个尝试学习将 Ruby 连接到数据库的基础知识的教程。目前,我有一个程序使用 twilio 接收短信,并根据您所说的发回一条消息。我正在尝试使用 SQLite3 将电话号码和消息的许多其他部分存储到数据库中,但是每当我运行代码时,数据库中都没有条目。这里是。

require 'twilio-ruby'
require 'google_places'
require 'sinatra'
require 'dotenv'
require 'sqlite3'

begin
    db = SQLite3::Database.open "test.db"
    db.execute "CREATE TABLE IF NOT EXISTS Entries(Id INTEGER PRIMARY KEY AUTOINCREMENT, Searched TEXT, Place TEXT, Number BLOB)"
    begin
db.execute "CREATE TABLE IF NOT EXISTS Entries(Id INTEGER PRIMARY KEY AUTOINCREMENT, Searched TEXT, Place TEXT, Number BLOB)"
db.execute("INSERT INTO Entries (Searched, Place, Number) VALUES(?,?,?)", @incoming, @best_place_fmt, @phonenumber)
rescue SQLite3::Exception => e 
    puts "Exception occurred"
    puts e
#ensure
#    stm.close if stm
#   db.close if db
end

所有的 twilio 函数都工作并且接收到消息并发送了一条消息,但是没有一个数据库命令实际上正在编辑文件。感谢您的帮助!

【问题讨论】:

  • 嗨,欢迎来到 SO - twilio 的东西似乎与您面临的问题本质上无关,对吗?如果是这样,您可以通过将您的答案缩减到代码的 DB 位来使回答者的生活更轻松(因此使您更有可能获得有用的回复) - 查看minimal reproducible example 了解更多信息:)
  • 您希望 SQLite 代码何时执行?你期望当前目录是什么? test.db 创建了吗? test.db的权限是什么?
  • 如果将 SQL 粘贴到 SQLite CLI 中,它是否有效?sqlite.org/cli.html
  • 除了你的实际问题:你有没有想过像Sequel(我最喜欢的)或Active Record这样的ORM(你不需要rails来使用它,ORM是独立的并且可以在没有导轨的情况下使用。)优点:您可以稍后更改数据库。

标签: sql ruby database sqlite sqlite3-ruby


【解决方案1】:

当我执行您的数据库相关代码时,我没有收到任何错误,并且数据库已填满。

如果我在此代码中添加select

require 'sqlite3'

begin
    db = SQLite3::Database.open "test.db"
    db.execute "CREATE TABLE IF NOT EXISTS Entries(Id INTEGER PRIMARY KEY AUTOINCREMENT, Searched TEXT, Place TEXT, Number BLOB)"
    db.execute "INSERT INTO Entries(Searched) VALUES ('Is')"
    db.execute "INSERT INTO Entries(Place) VALUES ('This')"
    db.execute "INSERT INTO Entries(Number) VALUES ('Working')"
    (db.execute "Select * from Entries").each{|dataset|
      p dataset
    }
rescue SQLite3::Exception => e 
    puts "Exception occurred"
    puts e
#ensure
#    stm.close if stm
#   db.close if db
end

然后我得到:

[1, "Is", nil, nil]
[2, nil, "This", nil]
[3, nil, nil, "Working"]

你是怎么看到的,数据库中没有条目?

你确定你选对了test.db?您可以使用p Dir.pwd查看实际目录。


问题修改后的例子:

如果我接受你的插入命令,当变量有值时

require 'sqlite3'
File.delete('test.db')  #Delete previous result and start with initial example.
@incoming = 'in'
@best_place_fmt = 'fm'
@phonenumber = 123456789
begin
    db = SQLite3::Database.open "test.db"
    db.execute "CREATE TABLE IF NOT EXISTS Entries(Id INTEGER PRIMARY KEY AUTOINCREMENT, Searched TEXT, Place TEXT, Number BLOB)"
    db.execute("INSERT INTO Entries (Searched, Place, Number) VALUES(?,?,?)", @incoming, @best_place_fmt, @phonenumber)
    (db.execute "Select * from Entries").each{|dataset|
      p dataset
    }
rescue SQLite3::Exception => e 
    puts "Exception occurred"
    puts e
#ensure
#    stm.close if stm
#   db.close if db

结束

我的结果:

 [1, "in", "fm", 123456789]

我在对该问题的评论中询问了您是否曾经考虑过 ORM 的使用。只是为了给你一个印象,下面有一个例子:

@incoming = 'in'
@best_place_fmt = 'fm'
@phonenumber = 123456789

require 'sequel'
db = Sequel.sqlite("test.db") #Here you could use also another DB
db.tables.each{|table| db.drop_table(table)}
db.create_table :entries2 do
  primary_key :id
  field :searched, :type => :text
  field :place, :type => :text
  field :number, :type => :blob
end
db[:entries2].insert(nil,@incoming, @best_place_fmt, @phonenumber)
puts db[:entries2].all #{:id=>1, :searched=>"in", :place=>"fm", :number=>"123456789"}

【讨论】:

  • 是的,事实证明我在使用 sqlite3 CLI 时没有打开数据库。我已将我的代码更新为现在的代码并创建表,但没有任何变量被放入数据库中。是否有一些特殊的方法可以将变量放入数据库条目中?
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2019-08-11
  • 2013-10-06
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多