170 похожих чатов

57 ответов

159 просмотров

типа не go way. сырой sql считается более конвенциональным

Потому что orm это зло. Часто генерит не очень очевидные запросы. А билдеры что называется straightforward way

Evgenii K
типа не go way. сырой sql считается более конвенци...

И отсутствие типизации заодно 🫠 Хотя с этим в целом ничего не сделать

NNurik N
Потому что orm это зло. Часто генерит не очень оче...

да я бы не сказал что прям зло. есть случаи когда лучше орм

Evgenii K
да я бы не сказал что прям зло. есть случаи когда ...

Если дело доходит до высокооптимального запроса, когда знаешь как работает планировщик, то orm превращается в костыль. И любой способ заставить сгенерить правильный запрос превращается в пытку.

NNurik N
Если дело доходит до высокооптимального запроса, к...

бтв это работает только если ты чемпион по sql. если нет то вполне бывает что нагенереные запросы быстрей

Evgenii K
бтв это работает только если ты чемпион по sql. ес...

А это ещё хуже - не знать что генерит orm и почему )

NNurik N
А это ещё хуже - не знать что генерит orm и почему...

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

Evgenii K
да хз. не знать что-то это не грех как по мне, у в...

Ну я же говорю типа зависит от критериев. Если мы говорим про разработку highitensive системы, то и человек там будет соответствующий все поднимать. А если фичи пилить и скорость доставки важнее, то да, orm спасет, но до по ры до времени, пока не прилетит нагрузка, а там голые запросы и ничего больше

NNurik N
Ну я же говорю типа зависит от критериев. Если мы ...

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

я не знаю кто не любит gorm. не любить инструмент, который может сэкономить время и повысить читаемость кода (после 30 минут изучения документации), как минимум, странно. основная проблема, в которую упирается любой орм - производительность. вторая явная проблема "машинные" запросы. зачастую бывает проще и быстрее собрать запрос руками. всё зависит от того, чем ваше приложение будет заниматься. если говорить о проблемах, которые специфичны для типизированного языка как go, то это рефлексия и избыточность. обычно, когда работаешь с орм, не очень хочется напрягаться и задумываться о накладных расходах. мы делает select, выбирая два поля, а в модель засовываем структуру, мапу или слайс из 10 полей. и всё это там путешествует под капотом. потом это приходится утилизировать gc, на всё на это тратится память и процессорное время в общем, gorm это прекрасный инструмент. но нужно понимать его лимиты

Evgenii K
да, но если интерфейсы между use кейсами и гейтвея...

Смотри вот простой кейс который не покрывается в gorm. Insert into on conflict с cte join на returning. Это вообще невозможно написать в нем

NNurik N
Смотри вот простой кейс который не покрывается в g...

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

Думаю будет проще показать ) сек

NNurik N
Думаю будет проще показать ) сек

главное вслух не читать, чтобы не вызвать диавола, да?))

NNurik N
Думаю будет проще показать ) сек

The currently accepted answer seems ok for a single conflict target, few conflicts, small tuples and no triggers. It avoids concurrency issue 1 (see below) with brute force. The simple solution has its appeal, the side effects may be less important. For all other cases, though, do not update identical rows without need. Even if you see no difference on the surface, there are various side effects: It might fire triggers that should not be fired. It write-locks "innocent" rows, possibly incurring costs for concurrent transactions. It might make the row seem new, though it's old (transaction timestamp). Most importantly, with PostgreSQL's MVCC model UPDATE writes a new row version for every target row, no matter whether the row data changed. This incurs a performance penalty for the UPSERT itself, table bloat, index bloat, performance penalty for subsequent operations on the table, VACUUM cost. A minor effect for few duplicates, but massive for mostly dupes. Plus, sometimes it is not practical or even possible to use ON CONFLICT DO UPDATE. The manual: For ON CONFLICT DO UPDATE, a conflict_target must be provided. A single "conflict target" is not possible if multiple indexes / constraints are involved. But here is a related solution for multiple partial indexes: UPSERT based on UNIQUE constraint with NULL values Back on the topic, you can achieve (almost) the same without empty updates and side effects. Some of the following solutions also work with ON CONFLICT DO NOTHING (no "conflict target"), to catch all possible conflicts that might arise - which may or may not be desirable. Without concurrent write load WITH input_rows(usr, contact, name) AS ( VALUES (text 'foo1', text 'bar1', text 'bob1') -- type casts in first row , ('foo2', 'bar2', 'bob2') -- more? ) , ins AS ( INSERT INTO chats (usr, contact, name) SELECT * FROM input_rows ON CONFLICT (usr, contact) DO NOTHING RETURNING id --, usr, contact -- return more columns? ) SELECT 'i' AS source -- 'i' for 'inserted' , id --, usr, contact -- return more columns? FROM ins UNION ALL SELECT 's' AS source -- 's' for 'selected' , c.id --, usr, contact -- return more columns? FROM input_rows JOIN chats c USING (usr, contact);

NNurik N
Смотри вот простой кейс который не покрывается в g...

Я не знаю ни одной orm, которая нормально умеет работать с нестандартными запросами. Для этого любая orm умеет в raw query

Ashish Cancelado
Я не знаю ни одной orm, которая нормально умеет ра...

Это вполне стандартный запрос для postgres и oracle

Ashish Cancelado
Я не знаю ни одной orm, которая нормально умеет ра...

Да, я кстати видел прожект который из gorm после всех оптимизаций остался только вызов Exec. И самое фиговое, что некоторые разрабы, наивно верили, что всё-таки ормка должна поддерживать все что нужно, и пытались оставить всеми силами возможность ее использования. Даже когда очевидно, что она не подходит. Т.е. это вторая сторона медали, когда есть неуверенность и элементы карго-культа, что боги написали орм и там все оптимально работает.

NNurik N
Да, я кстати видел прожект который из gorm после ...

честно сказать, не вижу большой проблемы держать инстанс для gorm'а

NNurik N
Да, я кстати видел прожект который из gorm после ...

когда в руках молоток все кажется гвоздем)

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

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

NNurik N
Да, я кстати видел прожект который из gorm после ...

А я видел ваз-2106 на треке, туда эта хреновина доехала самостоятельно, а вот обратно уже на эвакуаторе🤷‍♂️ Инструмент нужно подбирать под задачу

Ashish Cancelado
А я видел ваз-2106 на треке, туда эта хреновина до...

Не, это не так работает. Сперва пилится MVP и это на момент рождения проекта уже Легаси, которое в итоге будет переписано. Может тогда не надо орм ?

NNurik N
Да, я кстати видел прожект который из gorm после ...

Ты не поверишь, но это обычная эволюция проекта на любом языке с любой orm, уже много лет

Dmitriy
Ты не поверишь, но это обычная эволюция проекта на...

Ну так, в том и смысл выкинуть промежуточное звено эволюции и писать чистые запросы

NNurik N
Не, это не так работает. Сперва пилится MVP и это ...

Большая часть кода в mvp это будущее легаси. Может из-за этого перестать делать mvp и в целом не создавать новые бизнесы?

NNurik N
Ну так, в том и смысл выкинуть промежуточное звено...

Смысл mvp в том, что бы максимально быстро создать продукт, выкинуть его на рынок и начать операционную деятельность. Если orm позволяет на этом этапе сэкономить время - глупо от неё отказываться

Ashish Cancelado
Смысл mvp в том, что бы максимально быстро создать...

Это не аргумент, скорость запуска орм, никак не прямо не коррелирует со скорость деливери продукта

NNurik N
Ну так, в том и смысл выкинуть промежуточное звено...

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

Ashish Cancelado
Смысл mvp в том, что бы максимально быстро создать...

Напоминает анекдот про кредиты и нового русского мне. Цель MVP — сделать работоспособный продукт, который можно поддерживать. Если ваш продукт поддерживать невозможно, то вы выдаёте POC за MVP

NNurik N
Да, я кстати видел прожект который из gorm после ...

https://habr.com/ru/companies/lingualeo/articles/515530/ )))))))) TLDR: парни повыгоняли поганой метлой PHP разрабов, которые не правильно делали-готовили запросов, перевели все на хранимки и у них скорость поправилась. БД, как водиться, ботлнек при хреновой архитектуре и отсутсвии нормальной структуры, запросов и даже индексов. От этого у хаброжителей и любителей ORM сгорела жепа)

NNurik N
Ну так, в том и смысл выкинуть промежуточное звено...

Уже давно так делаю и другим рекомендую. Область применимости orm очень узкая. Это та же история, что из высокоуровневыми фреймфорками - все эти типовые "уже написанные" паттерны быстро дают первые результаты на старте, но потом скорость реализации фич начинает падать из-за того-что тривиальная задача превращается в борьбу с рамками выставленными orm/фрэймворком.

🅵🅾️🆇
https://habr.com/ru/companies/lingualeo/articles/5...

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

🅵🅾️🆇
https://habr.com/ru/companies/lingualeo/articles/5...

это статья для маркетинга ) на самом деле там кухня очень-очень адская была внутри ) со срывами сроков, нервами, багами и прочим )

Евгений Омельченко
Напоминает анекдот про кредиты и нового русского м...

Если ваш продукт невозможно поддерживать из-за orm, то скорее всего проблема не в orm)

Владимир Столяров
О, это любители мягко говоря сомнительных решений....

Ну мораль басни не в хранимках, а в том, что надо нормально запросы писать и хоть иногда планировщик запроса запускать, не говоря уж про индексы (про селективность также не забываем и не переусердствуем) Такто можно большинство бэкэндеров на мороз и вструмить hasura, если у вас там сплошные CRUD запросики)

🅵🅾️🆇
Ну мораль басни не в хранимках, а в том, что надо ...

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

Евгений Омельченко
При чём тут ORM? Мы же тут горм обслуждаем, правда...

Мне казалось что мы тут обсуждаем orm в целом, в существовании gorm лично я никакого смысла не вижу

Ashish Cancelado
Мне казалось что мы тут обсуждаем orm в целом, в с...

Обсуждение было вокруг gorm. Тезис в том, что он кривой из коробки как орм в целом.

NNurik N
Обсуждение было вокруг gorm. Тезис в том, что он к...

Всем известно издавна, он был сделан из говна (с) Что тут обсуждать то?

Ashish Cancelado
Всем известно издавна, он был сделан из говна (с) ...

Ну меня всегда триггерит какое-то эфемерное ускорение деливери

Потому же почему не любят ORM в других языках)

потому что он слабенький. В каждом orm есть первая космическая скорость - когда удобней просто руками написать запрос, чем возиться с билдером. И вот в горме она очень маленькая.

Владимир Гришин
потому что он слабенький. В каждом orm есть первая...

Это вторая космическая. Первая космическая — взять нормальный билдер

каждый раз когда я вижу вопрос в духе: я тут написал db.Where("amount > (?)", db.Table("orders").Select("AVG(amount)")).Find(&orders) а оно почему-то не работает. Чтобы разобраться нужно держать в голове поля модели, тэги, поля в базе, и последовательность операций в ОРМ. Как разработчик и руководитель небольшой команды, я думаю это трата времени и денег. Прочитать SQL запрос не сложно, если хочется удобств, есть sqlx и squirell, где можно сдампить sql и понять что происходит. С Гормом это сложнее, ну или это сложнее для меня

Александр Костюченко
а gorm кстати не имеет метода типа ToSQL?

кстати, имеет https://gorm.io/docs/sql_builder.html#ToSQL. Но непонятно, в какой момент придется его использовать

потому-что оно абстрагирует важные детали имплементации

Roman Sharkov
потому-что оно абстрагирует важные детали имплемен...

хибернейт или алхимия или там активрекорд тоже абстрагируют важные детали имплементации, но их любят

Гарик-Захватчик Автор вопроса
Roman Sharkov
потому-что оно абстрагирует важные детали имплемен...

Просто как я понимаю, это в го сообщество такое отношение к орм, в питоне например уважают и поклоняются орм, поэтому я сразу подумал что дело в самом gorm, а не в орм в целом, так значит gorm хорош или нет?

Гарик Захватчик
Просто как я понимаю, это в го сообщество такое от...

Gorm должен попробовать каждый разработчик, который приходит в go из других языков. Попробовать и понять, что лучшей orm для go еще не изобрели

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта