ОК, я застрял на этом уже несколько раз.Я хочу использовать гем mysql для заполнения базы данных данными из xml-файла, но когда я пытаюсь выполнить подготовленные операторы, у меня возникает проблема.
@dbi = Mysql.new(@host,@userid,@pwrd,@database)
query = "INSERT IGNORE INTO sha1( sha1_date, sha1) VALUES (? , ?) "
@prep = @dbi.prepare(query)
res = @prep.execute( ir.date, ir.sha1)
#this first query works, i can find the inserted row in the DB
@prep = @dbi.prepare("SELECT id FROM sha1 WHERE sha1 = ?")
res = @prep.execute(ir.sha1)
puts res.fetch
#but here the prepared statement return an empty string.
Я хочу иметь возможность выполнять SELECTтак, потому что окончательный запрос будет выглядеть примерно так
query = "INSERT INTO integration_job(sha1_id, branch_id, integration_stage_id, status_id, name) VALUES (
(SELECT id FROM sha1 WHERE sha1 = ?),
(SELECT id FROM branch WHERE name = ?),
(SELECT id FROM integration_stage WHERE name = ?),
(SELECT id FROM integration_status WHERE name = ?),
?)"
@prep = @dbi.prepare(query)
res = @prep.execute(ir.sha1, ir.branch, ir.stage, ir.status, ir.job
Я пытался делать те же типы запросов с другими таблицами, и это работало.Я предполагаю, что аргумент, который я передаю методу execute (), слишком длинный.
puts ir.sha1 # => dba759e168e734fcc2eaf114269879177ef6a0b1
Но я не могу найти информацию о предельном размере аргументов, поэтому я не знаю, что именноделать.
Итак, у меня есть несколько вопросов:
- Существует ли предельный размер для аргументов метода execute ()?(и если да, то что это?)
- Как я могу обойти это и сделать подготовленные утверждения с тем же результатом, но без sha1 в качестве аргумента? Использование другого драгоценного камня - идея, но я не знаю, какой именно .
[Редактировать] ОК. Я нашел решение, простоЯ ограничил размер поля VARCHAR, в котором хранится sha1, до 40 символов.(Мне показалось, что длина sha1 IS составляет 40 символов). Но анализ sha1 добавил символ конца строки в строку, сделав его длиной 41 символ.Я удалил его с помощью gsub ("\ n"), и теперь все работает нормально.
Спасибо за комментарии, они заставили думать об этом по-другому.