【问题标题】:Ruby statement with embedded SQL INSERT - Syntax error带有嵌入式 SQL INSERT 的 Ruby 语句 - 语法错误
【发布时间】:2013-07-11 20:44:53
【问题描述】:

我有以下 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[....

等等

我尝试了不同的选项,但似乎无法解决这个问题。有人可以帮我解决这个问题吗

【问题讨论】:

    标签: sql ruby exception insert


    【解决方案1】:

    我可以看到三个语法错误。

    • 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")
      

    我看不出你的代码中引发错误的部分有什么问题,但我认为你没有显示你的程序的当前版本,因为它距离达到这个目标还有很长的路要走。

    【讨论】:

    • 我在上面添加了一些代码,因此应该清楚导致异常的原因。谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多