2016-10-03 12 views
3

Rubyをデータベースに接続するための基礎を学ぶチュートリアルに従っています。現在、私はtwilioを使ってSMSを受信し、あなたが言ったことに基づいてメッセージを返すプログラムを持っています。私は電話番号と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のものは、あなたが直面している問題と本質的に無関係であるように思える、そうだろうか?もしそうなら、コードのDBビットだけに答えをトリミングすることで、回答者の人生をより楽にすることができます(そして、役に立つ回答になるでしょう)。 – Jeff

+0

いつSQLiteコードが実行されると思いますか?現在のディレクトリが何時になると思いますか? 'test.db'は作成されていますか? 'test.db'のパーミッションは何ですか? –

+0

SQLiteのCLIに貼り付けるとSQLが動作するのですか?https://www.sqlite.org/cli.html – Kris

答えて

1

DB関連のコードを実行すると、エラーは表示されず、データベースがいっぱいになります。

私はこのコードでのよう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"] 

はどのようにしてDBにエントリがないことを、見ましたか?

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

はい、sqlite3 CLIを使用しているときにデータベースを開いていませんでした。私は自分のコードを更新してテーブルを作成しますが、変数はデータベースに入れられません。変数をデータベースエントリに入れる特別な方法はありますか? –

関連する問題