continue<p>Вот есть проект <a class="mention u-url" href="https://www.sqlalchemy.org/" rel="nofollow noopener" target="_blank">sqlalchemy</a>. Люди стараются, пишут абстракции, что бы работать с SQL, как с объектами. Со стороны выглядит красиво.</p>
<p>Но начинаешь использовать банальные варианты: <code>sqlite</code> для локальных тестов, <code>postgresql</code> для реального сервера. Казалось бы: весь код написан на абстрактных объектах и мы просто поменяет URI базы данных и... нет, оказывается это так не работает:</p>
<ul><li>работа с датой/временем - разные функции</li><li>хочешь <code>ON CONFLICT</code> при вставке - разные реализации в разных диалектах</li><li>хочешь <i>нормальное</i> <code>JSON</code> поле - не забудь сделать код, который использует тип <code>JSONB</code> для <code>postgresql</code></li></ul><p>И так далее. Думаешь: ОК, наверное я просто что-то не понимаю в современной библиотеке...<br>Ага, вот как раз под руку попалась реализация хранилища объектов в БД на основе <code>sqlalchemy</code> в <a class="mention u-url" href="https://github.com/google/adk-python/blob/main/src/google/adk/sessions/database_session_service.py" rel="nofollow noopener" target="_blank">библиотеке adk от гугла</a>. И весь тот же самый <i>закат солнца вручную</i>:</p>
<pre><code>$ grep dialect google/adk/sessions/database_session_service.py | grep '"'
if dialect.name == "postgresql":
if dialect.name == "mysql":
if dialect.name == "postgresql":
if dialect.name == "postgresql":
if dialect.name == "mysql":
if self._dialect_name == "sqlite":</code></pre><p></p>