Поддержка SQL Server в Exposed

Nov 15, 2017 16:30

Недавно я писал про свой коммит в Open Source, а вчера вышла новая версия Exposed - библиотеки для работы с SQL для Kotlin, для которой я занимался поддержкой SQL Server. Раньше тестирование с использованием Docker требовалось только для Oracle и его поддержка стояла несколько особняком, но с SQL Server без Docker делать нечего, поэтому интеграцию Docker в инфраструктуру проекта пришлось существенно доработать.

Добавление нового диалекта в базовой версии сводится к тому, чтобы починить для него все тесты, благо тестов в Exposed достаточно. Конечно, с SQL Server обнаружились свои специфические проблемы. Например, в поле типа DATETIME можно хранить миллисекунды, но только с точностью до 2 миллисекунд, то есть сохраняешь одно значение, в вернуться потом может немного другое. Решается проблема использованием DATETIME2.

Самая большая проблема возникла с поддержкой batch insert. Дело в том, что Exposed возвращает ID добавленных записей, а SQL Server, при попытке их получить, сразу бросает исключение. Можно вставлять записи по одной, но тогда не будет никого прироста производительности, который ожидается от batch insert. Поэтому у Exposed внутри batch insert для SQL Server реализован как INSERT INTO tableName (column1, column2) OUTPUT inserted.id VALUES (?,?), (?,?), ...

Нужно сказать, что все содержательные технические решения сделал Tapac, за что ему большое человеческое спасибо. Моя роль свелась к созданию изначального pull request и выявлению имеющихся проблем, но вроде как этого достаточно, чтобы считаться соавтором.

kotlin

Previous post Next post
Up