LINUX.ORG.RU

неуникальный пользователь - как обработать нарушение уникальности ключа

 , ,


1

1

Хочу запилить для упражнения систему личного кабинета на go+postgresql. Нормальной пока не нашёл, посему велосипед.

Вопрос такой. При попытке регистрации с дублирующимся именем пользователя E-mail я буду пытаться сделать insert в базу. При наличии дубликата возникнет исключение. Я хочу сделать следующее: написать хранимку, которая перехватывает такое исключение, определяет ключ и таблицу, в которых оно случилось, и уже на уровне хранимки генерирует тот текст, который будет показан конечному пользователю.

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

Но я знаю, что есть идеология «база данных - это только хранилище данных, никаких триггеров быть не должно». Насчёт хранимок я жёсткого запрета не слышал, но в случае ORM оно как бы по построению так получается.

Соответственно, прошу либо подтвердить, что я делаю правильно, либо привести аргументы против. Пока я вижу такой аргумент, что при условии шардинга никакого нарушения ключа может и не быть, и в этом случае нужно как-то руками делать транзакцию, в которой проверять уникальность ключа в рамках всех БД.

Но пока этот момент не наступил, зачем о нём думать?

==================================================

Решение: выяснилось, что sqlx предоставляет достаточно инфы (имя таблицы, имя констрейнта) в ошибке, а при конфликте между транзакациями ошибка тоже указывает на нарушенное ограничение уникального ключа. Так что нет нужды делать хранимки (пока что). Вопрос про шардинг не решён, но его мы и не пытались решить.

★★★★★

Последнее исправление: den73 (всего исправлений: 4)

Дак заводи нового пользователя вызовом хранимки.

Тут либо трусы снять либо крестик надеть.

pon4ik ★★★★★
()
Ответ на: комментарий от AndreyKl

Плохо ты делаешь. Надо дать достаточную инфу, чтобы пользователь мог сообщить её в службу поддержки. Ну и подумать об угрозах безопасности (например, чтобы в сообщение об ошибке не попала конфиденциальная инфа).

den73 ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

Заведение пользователя подразумевает ряд скоординированных действий: обновление базы, генерация веб-страницы, отправка эл.почты. Может быть, постгрес всё это и умеет, но вряд ли я так буду делать, я же в голанге упражняюсь :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Тебе виднее как делать. По крайней мере как делать тебе.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)

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

Локализация тоже будет в хранимке?

AnDoR ★★★★★
()
Ответ на: комментарий от AnDoR

Предполагалось локализацию тоже делать в хранимке, да. Но см. в конце поста уже решение написано - этот подход не нужен, т.к. в клиент приходит достаточно информации об исключении.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

буду пытаться сделать insert в базу. При наличии дубликата возникнет исключение.

Либо ты делаешь это в хранимке и там же обрабатываешь сбой. Либо ты всё делаешь на клиентсайд и остаёшься в рамках sql. Клиент либо толстый либо тонкий, если то так то сяк, то выходит слоёный пирог, за который саппорт тим потом выясняет где ты живёшь и устраивает сеанс пиромании.

Остальное - лапша. Мухи, котлеты, кони люди, это всё.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

В целом не вижу проблемы иметь и хранимки, и клиентсайд, но в данном случае вполне хватит простого insert-а. Для тех, кто умеет пользоваться грепом, анализ такой программы не должен составлять проблему. И большие программы в кровавом энтерпрайзе, ценой много миллионов долларов, написаны именно так (часть логики - в хранимках, а часть - в клиент-сайд). Что бы об этом не говорил ЛОР.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Особенно, если ты сам - автор

Вот так обычно это всё и начинается.

грепается всё без проблем

Можно и без сорцов. Вопрос как всегда в цене;)

pon4ik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.