Я конвертирую скрипт узла в рубиновый, просто чтобы освежить в памяти язык (в последнее время у меня не было особых причин его использовать) и хочу использовать вставку MySQL в запросе на обновление дубликата ключа, который был подготовлен в расширенном режиме. . Запрос готовится так
$add_update = db.prepare('insert into `titles` (`title`,`image`,`sku`) value (?,?,?) on duplicate key update `title`=?,`image`=?')
но это исполнение, это некрасиво
$add_update.execute('Item','item.jpg','00012534','Item','item.jpg');
Естественно, эти вопросительные знаки немного сбивают с толку (я уже запутался, когда только обновлял исходное изображение). Я пробовал связывать имена в запросе, и, хотя MySQL не возражает против этого драгоценного камня, который я использую, mysql2, но его документация создает впечатление, что это возможно, я не вижу никаких подробностей о том, как это сделать.
В идеале я мог бы передать хеш, содержащий ключи и значения, которые я хочу использовать, но мой google-fu меня подвел (я, вероятно, просто использую неправильные термины, так как не могу представить, что он не поддерживается). Что-то вроде:
$add_update = db.prepare('insert into `titles` (`title`,`image`,`sku`) value (:title,:image,:sku) on duplicate key update `title`=:title,`image`=:image')
$add_update.execute({:title=>'Item',:image=>'image.jps',:sku'00012534'});
Я не использую рельсы и выбрал mysql2 simple, потому что это был первый драгоценный камень, который я нашел для взаимодействия с моим существующим сервером mysql. Если есть еще один драгоценный камень, который поддерживает то, что я ищу, у меня нет проблем с изменением, этот проект на самом деле просто для того, чтобы немного попрактиковаться в рубине и избавиться от паутины.
A) Я знаю, что это глобальная переменная B) привычка к javascript и PHP, я удаляю их, когда замечаю их C) пока вызов работает нормально, он не передает переменные в подготовленный оператор, оставляя меня с кучей неожиданных значений null поле в базе данных
Опять же, не используйте глобальные переменные. Это очень плохая привычка. Вам также следует отказаться от ;, поскольку здесь действует принцип «Когда в Риме». Руби их совершенно не использует. PHP должен. JavaScript зависит от вашей философии. Важно сохранять последовательность.
Также следует отметить, что вы можете использовать ON DUPLICATE KEY UPDATE title=VALUES(title), image=VALUES(image) без необходимости повторять заполнители.
Только три поля будут заполнены этим, остальные будут NULL. Какие поля вам также нужно заполнить?
Я знаю, что глобальные переменные - это плохо, но меня больше интересовало, чтобы это работало, чем заставить их работать хорошо. Я просто работал над черновой версией, чтобы посмотреть, сработают ли мои идеи, это далеко от производственного кода. И да, снова решился знать; не нужны, я ставлю их в привычку, а затем удаляю, как только замечаю их, я не обновлял вопрос, потому что, хотя да, они плохие, они не важны в отношении вопроса.
Дело не в том, что 3 поля были заполнены, а остальные были пустыми, а в том, что 3 поля, которые должны быть заполнены, были пустыми. Хотя использование VALUES (title) и т.п. будет работать, я все же предпочел бы использовать правильно названные переменные, поскольку это сделает код более читаемым и легким для понимания позже.
Это может быть ограничение для вашего драйвера, когда он не связывает одно и то же значение несколько раз. Вот почему может помочь использование VALUES(x) вместо :x.






A) Не используйте глобальные переменные с префиксом
$в Ruby. Б) Не используйте;, если это не является строго необходимым (например, однострочники). C) Вы можете вызывать с хеш-аргументами и опускать фигурные скобки{ ... }при вызовах, напримерexecute(title: '...', image: '...', sku: '...'), который имеет гораздо более простой синтаксис.