sql - 使用 SQLite3 (Ruby) 的数据库没有插入

标签 sql ruby database sqlite sqlite3-ruby

我正在学习尝试学习将 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 函数都可以工作,并且接收到消息并发送了一条消息,但实际上没有任何数据库命令在编辑文件。感谢您的帮助!

最佳答案

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

如果我在这段代码中添加一个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"}

关于sql - 使用 SQLite3 (Ruby) 的数据库没有插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39824066/

相关文章:

sql - PostgreSQL 对分层查询结果中的记录进行排序

sql - 如何按小时从oracle数据库中获取数据

mysql - 如何从我的 mysql 数据库表 "userlog"获取高峰时间

ios - 'pod init' 返回:不允许操作 - getcwd (Errno::EPERM)

基于 Excel 文件数据库上的日期的 SQL 查询

java - SQL:多对多解析和交叉实体

ruby-on-rails - 引用 object.id 与 object[ :id] when you return a Model dataset? 之间有什么区别

ruby - Docker Ruby Rack Redis 队列

mysql - SQL:GROUP BY 子句中的所有属性都需要在 SELECT 子句中列出吗?

mysql - 具有多重关系的表的数据库设计