ruby -v 2.3.7
(sqlite3与较新的ruby -v具有兼容性问题)
sqlite3 -v 3.22
sqlite -v 2.8
lsb_release -a 18.04
我已经尽可能地精简了代码。
def some_method(info_hash)
...
db.results_as_hash = true
sum = 0
db.transaction
db.execute2 "CREATE table if not exists a_table(Id INT PRIMARY KEY, Type TEXT, Month TEXT, Amount FLOAT, TOTAL FLOAT)"
db.execute2 "INSERT into a_table(Type, Month, Amount) values(:Type , :Month , :Amount)", info_hash[:category], info_hash[:month], info_hash[:amount]
get_amt = db.prepare "SELECT Amount from a_table WHERE Type = :Type"
get_amt.execute info_hash[:category]
get_amt.each do |g|
sum += g #here I get a NoMethodError for Nil:NilClass
end
db.execute2 "INSERT into bills(Total) values(:sum)", sum
db.commit
...
end
我主要使用execute2
方法。我依靠execute
方法,在这里我需要忽略标头,例如在我的get_amt.each
块中。
我想为sum
的{{1}}列中的Amount
。但是运行Type
时遇到NoMethodError
。
完整错误为:
block
请告知我哪里出问题了。
编辑: 我重写了代码以反映@Shawn的建议:
undefined method '+' for nil:NilClass (NoMethodError)
这将产生def some_method(info_hash)
...
db.transaction
db.execute2 "CREATE table if not exists a_table(Id INTEGER PRIMARY KEY, Type TEXT, Month TEXT, Amount FLOAT, Total FLOAT)"
db.execute2 "INSERT into a_table(Type, Month, Amount) values(:Type , :Month , :Amount)", info_hash[:category], info_hash[:month], info_hash[:amount]
get_amt = db.execute2 "SELECT sum(Amount) from a_table WHERE Type = :Type", info_hash[:category]
db.execute2 "INSERT into a_table(Total) values(:get_amt)", get_amt
db.commit
...
end
sqlite3 Exception
答案 0 :(得分:0)
db.execute2 "INSERT into a_table(Total) values(:get_amt)", get_amt[1][0]
基本上,语句get_amt = db.execute2 "SELECT sum(Amount) from a_table WHERE type = :type", hash_info[category]
将多个值写入get_amt
变量中。
必须为变量提供row
使用的 specific 值的column
和INSERT
。因此,get_amt[1][0]
或第一行(标题行之后的下一行)和第一列。