Ошибка MySQL: `query ': Дублирующая запись' 'для ключа 3 (Mysql2 :: Error) в файле Ruby - PullRequest
0 голосов
/ 10 июня 2011

Это код, который я использую

# update db
client = Mysql2::Client.new(:host => "localhost", :username => "jo151", :password => "password", :database => "jo151")

details.each do |d|
    if d[:sku] != ""
        price = d[:price].split

        if price[1] == "D"
            currency = 144
        else
            currency = 168
        end

        cost = price[0].gsub(",", "").to_f

        if d[:qty] == ""
            qty = d[:qty2]
        else
            qty = d[:qty]
        end 

        results = client.query("SELECT * FROM jos_virtuemart_products WHERE product_sku = '#{d[:sku]}' LIMIT 1;")
        if results.count == 1
            product = results.first


                            client.query("UPDATE jos_virtuemart_products SET product_sku = '#{d[:sku]}', product_name = '#{d[:desc]}', product_desc = '#{d[:desc]}', product_in_stock = '#{qty}' WHERE virtuemart_product_id = 
    #{product['virtuemart_product_id']};")

                client.query("UPDATE jos_virtuemart_product_prices SET product_price = '#{cost}', product_currency = '#{currency}' WHERE virtuemart_product_id = '#{product['virtuemart_product_id']}';")
            else
                client.query("INSERT INTO jos_virtuemart_products( product_sku, product_name, product_s_desc, product_in_stock)  VALUES('#{d[:sku]}','#{d[:desc]}','#{d[:desc]}','#{d[:qty]}');")
                last_id = client.last_id

                client.query("INSERT INTO jos_virtuemart_product_prices(virtuemart_product_id, product_price, product_currency) VALUES('#{last_id}', '#{cost}', #{currency});")
            end
        end
    end

`query ': Duplicate entry' 'для ключа 3 (Mysql2 :: Error) в строке 35:

client.query("INSERT INTO jos_virtuemart_products( product_sku, product_name, product_s_desc, product_in_stock)  VALUES('#{d[:sku]}','#{d[:desc]}','#{d[:desc]}','#{d[:qty]}');")
                last_id = client.last_id

1 Ответ

1 голос
/ 10 июня 2011

Помещать в необработанные операторы SQL произвольные строки, подобные этим, крайне опасно . Вы абсолютно должны избегать любых значений, введенных в них, чтобы ваше приложение работало вообще. Первое описание, которое вы получите с апострофом, приведет к сбою SQL.

В этом случае вы должны использовать client.quote для каждой строки. Без исключений. Вы, наверное, видели тонны прессы о том, что Sony взломали, и именно из-за таких ошибок происходят серьезные нарушения.

Вы должны исследовать использование ORM, чтобы помочь с этим, даже чем-то таким простым, как Sequel или DataMapper, поскольку они предоставляют средства, облегчающие это.

Причина, по которой вы получаете дубликат ключа, заключается в том, что у вас есть уникальный индекс для одного из столбцов, в который вы вставляете, или один из столбцов не указан и имеет значение по умолчанию, которое конфликтует с существующей строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...