пятница, 30 июня 2017 г.

Как кодогенерация спасает мир

Была свежая задача модифицировать довольно древний код: 2012 год, perl, всё как всегда.

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

В старом проекте использовалась довольно большая схема базы данных, десятки таблиц, ORM и писать типовые sql запросы мне наскучило за десять минут.

Погуглил немножко и нашел  https://github.com/knq/xo который кодогенерацией запросто решает проблему запросов на CRUD для единичных объектов, получить, сохранить, взять зависимый.

Особенно понравилось в его архитектуре вынесенные templates.
Лучше было 20 минут потерять на настройку их, и получать шикарные файлы моделей.

Нерешенной осталась задача когда нужно было получать списки объектов что то типа scan.

Можно наверное было и это описать в шаблонах, но я сходу не осилил, и нашел scaneo.

Один мелкий патч (пока в апстрим не приняли можно здесь увидеть) https://github.com/korjavin/scaneo и он уже умеет игнорировать служебные поля xo и генерит отличные сканеры.

В итоге, два пакета для кодогенерации, и пакет моделей готово.

Однако, надо понимать что это совсем ещё не ОРМ. Сохранить/Достать объект он может уже, но вот запросы sql для сканеров ещё нужно генерировать.

И тут мне помог https://github.com/Masterminds/squirrel

с их способом

sql, _, _ := 
 psql.Select("*").From("elephants").Where("name IN (?,?)", "Dumbo", "Verna")

 уже вполне можно жить.

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