2016-10-03 3 views
3

Я следую учебнику, пытаясь изучить основы подключения Ruby к базе данных. В настоящее время у меня есть программа, которая получает sms, используя twilio, и отправляет обратно сообщение, основанное на том, что вы сказали. Я пытаюсь сохранить номер телефона и многие другие части сообщения в базе данных с помощью SQLite3, но при каждом запуске кода в базу данных нет записей в базе данных. Вот.База данных с использованием SQLite3 (Ruby) не вставляет

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 функции работы и получено сообщение и сообщение отправляется, но ни одна из команд базы данных фактически не редактируя файл. Спасибо за помощь!

+3

Привет, Добро пожаловать в SO - кажется, что Twilio материал, по существу, не имеет отношения к проблеме вы столкнулись, это будет правильно? Если это так, вы можете облегчить жизнь для ответчиков (и, следовательно, более вероятно, что вы получите полезный ответ), обрезая ваш ответ на бит БД кода - проверьте [MCVE] для получения дополнительной информации :) – Jeff

+0

Когда вы ожидаете выполнения кода SQLite? Что вы ожидаете от текущего каталога, когда он это делает? Создан ли 'test.db'? Каковы разрешения на 'test.db'? –

+0

Работает ли SQL, если вы вставляете его в CLI SQLite? Https: //www.sqlite.org/cli.html – Kris

ответ

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] 

Я спросил в комментарии к вопросу, если вы когда-либо задумывались об использовании ОРМ. Просто чтобы дать вам представление ниже пример с продолжением:

@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"} 
+0

Да, оказывается, я не открывал базу данных при использовании CLI sqlite3. Я обновил свой код до того, что сейчас существует, и он создает таблицу, но ни одна из переменных не помещается в базу данных. Есть ли какой-то особый способ поместить переменные в запись базы данных? –