0

次の Ruby スクリプトがあります。データベースを作成し、csv ファイルを読み取り、各行をデータベースに挿入します。

 require "sqlite3"
 require "csv"
 require "pp"

begin
 db = SQLite::Database.new("myDB.db")
 db.execute("CREATE TABLE IF NOT EXISTS MYTABLE(Id INTEGER PRIMARY KEY AUTOINCREMENT, 
  stations TEXT, dayparts TEXT, age TEXT, rtg DOUBLE, reach DOUBLE")

 myData  = {}
 CSV.foreach("test_file.csv", :headers=>true, :header_converters => :symbol, :converters => :all)              
 do |row|
  row.to_hash.each do |key, value|
   mydata[key.to_sym] = value
  end
 db.execute("INSERT INTO myDB(stations, dayparts, age, rtg, reach) VALUES(?,?,?,?,?)", 
 myDATA[:stations], myData[:dayparts], myData[:age], myData[:rtg], mydata[:dlyrch000])
 end

rescue SQLite3::Exception => e
  puts "Exception occured"
  puts e

ensure
  db.close if db
end

このスクリプトを静的データで実行すると。それはこの行です:

 db.execute("INSERT INTO myDB(stations, dayparts, age, rtg, reach) VALUES(?,?,?,?,?)", 
   myDATA[:stations], myData[:dayparts], myData[:age], myData[:rtg], mydata[:dlyrch000])

は次のように置き換えられます。

 db.execute("INSERT INTO myDB(stations, dayparts, age, rtg, reach) VALUES(?,?,?,?,?)", 
 test, test, 33, .8989, .23434)

このデータを使用してデータベースが作成されます。

しかし、上記のようにこのスクリプトを試すと、例外がスローされます。

 syntax error, unexpected ",", expecting ')' ... rtg, reach) VALUES (?,?,?,?,?)",  
 ---> myData [:stations], myData[....

さまざまなオプションを試しましたが、これを回避できないようです。誰かがこれで私を助けてくれますか

4

1 に答える 1

1

構文エラーが 3 つあります。

  • 閉じ引用符のCREATE TABLE前に閉じ括弧がない SQL ステートメント。次のように見えるはずです

    db.execute("CREATE TABLE IF NOT EXISTS MYTABLE(Id INTEGER PRIMARY KEY AUTOINCREMENT,
        stations TEXT, dayparts TEXT, age TEXT, rtg DOUBLE, reach DOUBLE)")
    
  • のブロックはCSV.foreach、次のように、メソッド呼び出しの閉じ括弧と同じ行で開始する必要があります。

    CSV.foreach("test_file.csv", :headers => true, :header_converters => :symbol, :converters => :all) do |row|
      ...
    enc
    
  • データベース コンストラクターはSQLite、あるべきときに を使用しますSQLite3。このような

    db = SQLite3::Database.new("myDB.db")
    

エラーが発生しているコードの部分に問題はありませんが、プログラムの現在のバージョンが表示されていないと思います。

于 2013-07-11T21:22:09.577 に答える