# Подключение SQLite к dbt v1

Локальная разработка

Плагин сообщества

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

* **Поддерживается**: Community
* **Авторы**: Jeff Chiu (https\://github.com/codeforkjeff)
* **Репозиторий GitHub**: [codeforkjeff/dbt-sqlite](https://github.com/codeforkjeff/dbt-sqlite) [![](https://img.shields.io/github/stars/codeforkjeff/dbt-sqlite?style=for-the-badge)](https://github.com/codeforkjeff/dbt-sqlite)
* **Пакет PyPI**: `dbt-sqlite` [![](https://badge.fury.io/py/dbt-sqlite.svg)](https://badge.fury.io/py/dbt-sqlite)
* **Канал Slack**: [n/a](https://www.getdbt.com/community)
* **Поддерживаемая версия dbt**: v1.1.0 и новее
* **Поддержка dbt**: Not Supported
* **Минимальная версия платформы данных**: SQlite Version 3.0

## Установка dbt-sqlite

Установите адаптер с помощью \`pip\`: `python -m pip install dbt-sqlite`

## Настройка dbt-sqlite

Конфигурацию, специфичную для SQLite, см. на странице [настроек SQLite.](https://docs.getdbt.tech/reference/resource-configs/no-configs.md)

Начиная с выпуска dbt 1.0.0, старшая и младшая части [версии](https://semver.org/) dbt-sqlite совпадают с соответствующими частями версии dbt v1.

* версии 1.1.x этого адаптера работают с dbt 1.1.x

* версии 1.0.x этого адаптера работают с dbt 1.0.x

* версии 1.1.x этого адаптера работают с dbt v1 1.1.x

* версии 1.0.x этого адаптера работают с dbt v1 1.0.x

## Подключение к SQLite с помощью dbt-sqlite

Цели SQLite должны быть настроены с использованием следующей конфигурации в вашем файле `profiles.yml`.

Пример:

\~/.dbt/profiles.yml

```yaml
your_profile_name:
  target: dev
  outputs:
    dev:
      type: sqlite
      threads: 1
      database: 'database'
      schema: 'main'
      schemas_and_paths:
        main: 'file_path/database_name.db'
      schema_directory: 'file_path'
      #optional fields
      extensions:
        - "/path/to/sqlean/crypto.so"
```

#### Описание полей профиля SQLite

| Поле                | Описание                                                                                                                                                                                                                                                                                                   |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type`              | Обязательный параметр. Должен иметь значение `sqlite`.                                                                                                                                                                                                                                                     |
| `threads`           | Обязательный параметр. Должен иметь значение `1`. SQLite блокирует всю базу данных при записи, поэтому значение > 1 не даст преимуществ.                                                                                                                                                                   |
| `database`          | Обязательный параметр, но его значение может быть произвольным, поскольку в SQLite имена отношений не содержат компонента 'database', поэтому он удаляется из результата ref() и из SQL во всех случаях. Этот параметр всё равно необходимо задать в конфигурации: dbt использует его для внутренних нужд. |
| `schema`            | Значение 'schema' должно быть определено ниже в schema\_paths. В большинстве случаев это должно быть main.                                                                                                                                                                                                 |
| `schemas_and_paths` | Сопоставляет схемы с путями: хотя бы одна из схем должна называться 'main'.                                                                                                                                                                                                                                |
| `schema_directory`  | Каталог, в котором все файлы \*.db подключаются как схемы, причём имя файла без расширения используется в качестве имени схемы, и в котором создаются новые схемы. Этот каталог может совпадать с каталогами файлов, указанных в schemas\_and\_paths, если это не вызывает конфликтов.                     |
| `extensions`        | Необязательный параметр. Список путей к файлам расширений SQLite, которые нужно загрузить. Для работы снимков необходим crypto.so; см. раздел «Расширения SQLite» ниже.                                                                                                                                    |

## Ограничения

* Схемы реализованы как подключенные файлы баз данных. (SQLite объединяет базы данных и схемы.)

  * SQLite автоматически присваивает 'main' файлу, к которому вы изначально подключаетесь, поэтому это должно быть определено в вашем профиле. Другие схемы, определенные в вашем профиле, подключаются при создании соединения с базой данных.

  * Если dbt нужно создать новую схему, она будет создана в `schema_directory` как `schema_name.db`. Удаление схемы приводит к удалению всех ее отношений и отсоединению файла базы данных от сессии.

  * Имена схем хранятся в определениях представлений, поэтому, когда вы обращаетесь к файлу базы данных, отличному от 'main', вне dbt, вам нужно будет подключить его с тем же именем, иначе представления не будут работать.

  * SQLite не позволяет представлениям в одной схеме (т.е. файле базы данных) ссылаться на объекты в другой схеме. Вы получите эту ошибку от SQLite: "view \[someview] cannot reference objects in database \[somedatabase]". Вы должны установить `materialized='table'` в моделях, которые ссылаются на другие схемы.

* Материализации упрощены: они удаляют и пересоздают модель, вместо выполнения резервного копирования и замены новой модели, которую поддерживают другие адаптеры баз данных dbt. Этот выбор был сделан, потому что SQLite не поддерживает `DROP ... CASCADE` или `ALTER VIEW` и не предоставляет информацию о зависимостях отношений в чем-то похожем на information\_schema. Эти ограничения делают действительно сложным правильную работу функции резервного копирования и замены. Учитывая, как SQLite агрессивно [блокирует](https://sqlite.org/lockingv3.html) базу данных, вероятно, это не стоит усилий.

## Расширения SQLite

Для работы снимков вам понадобится модуль `crypto` от SQLean, чтобы получить функцию `md5()`. Рекомендуется установить все модули SQLean, так как они предоставляют многие общие SQL-функции, отсутствующие в SQLite.

Предварительно скомпилированные бинарные файлы доступны для загрузки на [странице репозитория SQLean на GitHub](https://github.com/nalgeon/sqlean). Вы также можете скомпилировать их самостоятельно, если хотите.

Укажите на эти файлы модулей в конфигурации вашего профиля, как показано в примере выше.

Mac OS, по всей видимости, поставляется с [библиотеками SQLite, скомпилированными без поддержки загрузки расширений](https://docs.python.org/3/library/sqlite3.html#f1), поэтому это не будет работать «из коробки». Соответственно, снимки (snapshots) тоже не будут работать. Если вам нужна функциональность снимков, вам потребуется скомпилировать SQLite/python или найти дистрибутив python для Mac OS с такой поддержкой.
