使用纯红宝石的Mysql Float值插入

时间:2015-02-05 17:44:24

标签: mysql ruby

我有类似以下的红宝石代码:

client = Mysql2::Client.new(:host => "localhost", :username => "root", :password => "root")
client.query("CREATE TABLE Customers
                      (
                        Id INT PRIMARY KEY AUTO_INCREMENT,
                        Name VARCHAR(25),
                        CurrentDate DATE,
                        SourceCurrency VARCHAR(25),
                        TargetCurrency VARCHAR(25),
                        SourceAmount FLOAT(23,7),
                        TargetAmount FLOAT(23,7)
                      )"
                    )

    target_amount = source_amount * 0.7477

    client.select_db "project6"
    client.query("INSERT INTO Customers (Name, CurrentDate, SourceCurrency, TargetCurrency, SourceAmount, TargetAmount)VALUES(#{client.escape(customer_name)}, #{(Date.today)}, 'EUR', 'GBP', #{(source_amount)}, #{(target_amount)})")
    client.close

此处source_amounttarget_amount都是 float 。在我的 project6 表中,SourceAmount&的数据类型TargetAmount是float(23,7)。

但每当我运行此代码时,都会发生错误:

Uncaught exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '23:39:43 +0600, 'EUR', 'GBP', 120.0, 89.724)' at line 1

如果我设置customer_name = " emu" 则其他错误

Unknown column 'emu' in 'field list' (Mysql2::Error)

出了什么问题?

1 个答案:

答案 0 :(得分:1)

有几个问题。

(1)您提供Time.now的输出(默认为时间加上时区偏移量,空格分隔符,例如23:39:43 +0600)到SQL DATE属性,它不匹配。你需要提供一个日期。

(2)需要引用Name属性的值。否则,SQL认为您指的是属性名称。因此,如果您有customer_name = 'emu',那么您当前的查询只会将emu作为值,而不是'emu'。你可以通过几种不同的方式解决这个问题例如:

client.query("INSERT INTO Customers (Name, CurrentDate, SourceCurrency, TargetCurrency, SourceAmount, TargetAmount) VALUES ('#{client.escape(customer_name)}', #{(Date.today)}, 'EUR', 'GBP', #{(source_amount)}, #{(target_amount)})")

或者...

client.query("INSERT INTO Customers (Name, CurrentDate, SourceCurrency, TargetCurrency, SourceAmount, TargetAmount) VALUES ('" + client.escape(customer_name) + "', #{(Date.today)}, 'EUR', 'GBP', #{(source_amount)}, #{(target_amount)})")