Подготовленная вставка для повторяющихся ключевых запросов mysql в ruby

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

tadman 15.05.2018 00:36

A) Я знаю, что это глобальная переменная B) привычка к javascript и PHP, я удаляю их, когда замечаю их C) пока вызов работает нормально, он не передает переменные в подготовленный оператор, оставляя меня с кучей неожиданных значений null поле в базе данных

Phillip Gooch 15.05.2018 04:00

Опять же, не используйте глобальные переменные. Это очень плохая привычка. Вам также следует отказаться от ;, поскольку здесь действует принцип «Когда в Риме». Руби их совершенно не использует. PHP должен. JavaScript зависит от вашей философии. Важно сохранять последовательность.

tadman 15.05.2018 19:08

Также следует отметить, что вы можете использовать ON DUPLICATE KEY UPDATE title=VALUES(title), image=VALUES(image) без необходимости повторять заполнители.

tadman 15.05.2018 19:09

Только три поля будут заполнены этим, остальные будут NULL. Какие поля вам также нужно заполнить?

tadman 15.05.2018 19:10

Я знаю, что глобальные переменные - это плохо, но меня больше интересовало, чтобы это работало, чем заставить их работать хорошо. Я просто работал над черновой версией, чтобы посмотреть, сработают ли мои идеи, это далеко от производственного кода. И да, снова решился знать; не нужны, я ставлю их в привычку, а затем удаляю, как только замечаю их, я не обновлял вопрос, потому что, хотя да, они плохие, они не важны в отношении вопроса.

Phillip Gooch 18.05.2018 00:19

Дело не в том, что 3 поля были заполнены, а остальные были пустыми, а в том, что 3 поля, которые должны быть заполнены, были пустыми. Хотя использование VALUES (title) и т.п. будет работать, я все же предпочел бы использовать правильно названные переменные, поскольку это сделает код более читаемым и легким для понимания позже.

Phillip Gooch 18.05.2018 00:22

Это может быть ограничение для вашего драйвера, когда он не связывает одно и то же значение несколько раз. Вот почему может помочь использование VALUES(x) вместо :x.

tadman 18.05.2018 01:13
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
8
117
0

Другие вопросы по теме