скрипт ruby, использующий вставку ошибки dbi gem в таблицу mysql с новым индексом - PullRequest
1 голос
/ 29 октября 2011

У меня есть скрипт ruby, несколько раз выполняющий следующую инструкцию INSERT с использованием гема dbi:

sql = "INSERT INTO traffic_by_pages (publication_id, subdomain, region_id, region_name, page_url, site_section, yr, mnth, dy, TrafficDate, DailyVisitors, DailyVisits, DailyPageViews, NewVisitors, ReturningVisitors, object_id, object_type) VALUES (#{publication_id}, '#{subdomain}', #{region_id}, '#{region_name}', '#{page_url}', '#{site_section}', #{yr}, #{mnth}, #{dy}, '#{trafficdate}', #{dailyvisitors}, #{dailyvisits}, #{dailypageviews}, #{newvisitors}, #{returningvisitors}, #{obj_id}, '#{objectType}');"

Этот скрипт работал отлично до тех пор, пока несколько дней назад не выдал следующую ошибку:

У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' ')'.

Ошибка, похоже, началась с добавления индекса для object_id и object_type для таблицы, в которую она вставляется.Я сделал этот вывод, потому что, если я не вставлю значение для object_id, оператор волшебным образом работает.Кроме того, я снял индекс с нашей версии таблицы, и oila!Это снова сработало.Мне нужно сохранить этот индекс.

Кто-нибудь когда-нибудь имел дело с этой проблемой?Я собираюсь переписать сценарий, используя активную запись.Весь сценарий извлекает данные из базы данных MS SQL Server и INSERTS в базу данных MySQL.

Я должен также добавить, что когда дело доходит до программирования на Ruby, я действительно не знаю, что я делаю, и я не уверенкак этот скрипт в итоге был написан на Ruby.Любая помощь приветствуется.Спасибо!

1 Ответ

1 голос
/ 29 октября 2011

Похоже, это может быть проблема с цитированием.Посмотрите внимательно на сообщение об ошибке:

 ' '')'

Вы получаете пробел, за которым следует пустой строковый литерал, за которым следует закрывающая скобка в вашем SQL.Вы добавили столбцы object_id и object_type, и все сломалось, поэтому проблема, вероятно, в значениях object_type.

Вы не должны использовать интерполяцию строк для построения операторов SQL, вы должны использовать заполнители,Один из этих подходов может помочь:

sql = 'INSERT INTO traffic_by_pages (publication_id, subdomain, region_id, region_name, page_url, site_section, yr, mnth, dy, TrafficDate, DailyVisitors, DailyVisits, DailyPageViews, NewVisitors, ReturningVisitors, object_id, object_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
# For each row...
dbh.do(sql, 
    publication_id,
    subdomain,
    region_id,
    region_name,
    page_url,
    site_section,
    yr,
    mnth,
    dy,
    trafficdate,
    dailyvisitors,
    dailyvisits,
    dailypageviews,
    newvisitors,
    returningvisitors,
    obj_id,
    objectType
)

# or
sth = dbh.prepare(sql)
# for each row...
sth.execute(publication_id, subdomain, region_id, ...)

То, что он запускается и перестает работать, странно, но это может быть просто побочным эффектом ваших усилий по отладке.

...