> ## Documentation Index
> Fetch the complete documentation index at: https://cs-lua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# db

> SQLite: база — файл в каталоге плагина

# db

SQLite: база — файл в каталоге плагина.

Вкомпилирован в модуль: сервера, драйвера и конфига нет. Нужен там, где данные
надо **запрашивать**; для конфига и списка админов проще
[`store`](../store/index.md).

Значения передаются через `?` и подставляются драйвером.

```lua theme={null}
db:exec("INSERT INTO kills VALUES (?, ?, ?)", p:steamid(), weapon, os.time())
```

<Warning>
  Не склеивай запрос из данных игрока. Ник — это то, что игрок написал сам:
  через `?` он попадёт в базу строкой, чем бы ни был, в склейке — станет частью
  запроса.
</Warning>

## Типы

| Lua             | SQLite                                            |
| --------------- | ------------------------------------------------- |
| `nil`           | `NULL`                                            |
| `true`, `false` | `1`, `0` — булева типа в SQLite нет               |
| целое число     | `INTEGER`                                         |
| дробное         | `REAL`                                            |
| строка          | `TEXT` с длиной: двоичные данные проходят целиком |

Обратно `INTEGER` и `REAL` приходят числом, `TEXT` и `BLOB` — строкой. `NULL`
приходит как `nil`, то есть ключа в таблице строки просто нет.

Числа в Lua — double: точность целых кончается на 2^53.

## Запросы идут в кадре

Модуль однопоточный, запрос выполняется прямо в игровом кадре. Локальный файл в
WAL отвечает за доли миллисекунды, но запрос по таблице без индекса заморозит
сервер целиком, поэтому слишком долгий прерывается:

```
query aborted after 203ms (cslua_db_timeout_ms is 200).
Add an index, narrow the query, or raise the limit
```

| cvar                  | по умолчанию |                                                      |
| --------------------- | ------------ | ---------------------------------------------------- |
| `cslua_db_timeout_ms` | `200`        | дольше — прерывание ошибкой; `0` снимает ограничение |
| `cslua_db_warn_ms`    | `25`         | дольше — предупреждение с именем плагина             |

Увидел предупреждение — ставь индекс, а не поднимай лимит. Сторож не покрывает
ожидание блокировки: если файл базы держит другой процесс, ждать придётся честно.

## Открытие

|                           |                                   |
| ------------------------- | --------------------------------- |
| [`db.open`](open.md#open) | Открывает базу в каталоге плагина |

## Объект базы

|                                             |                                                     |
| ------------------------------------------- | --------------------------------------------------- |
| [`db:exec`](database.md#exec)               | Выполняет запрос, ничего не возвращающий            |
| [`db:query`](database.md#query)             | Выполняет запрос и возвращает все строки            |
| [`db:first`](database.md#first)             | Выполняет запрос и возвращает первую строку         |
| [`db:prepare`](database.md#prepare)         | Разбирает SQL один раз для многократного выполнения |
| [`db:transaction`](database.md#transaction) | Выполняет блок одной транзакцией                    |
| [`db:last_id`](database.md#last_id)         | Rowid последней вставки                             |
| [`db:changes`](database.md#changes)         | Сколько строк изменил последний запрос              |
| [`db:path`](database.md#path)               | Путь к файлу базы                                   |
| [`db:close`](database.md#close)             | Закрывает базу                                      |

## Подготовленное выражение

|                                       |                                                |
| ------------------------------------- | ---------------------------------------------- |
| [`st:run`](statement.md#stmt_run)     | Выполняет выражение, ничего не возвращающее    |
| [`st:query`](statement.md#stmt_query) | Выполняет выражение и возвращает все строки    |
| [`st:first`](statement.md#stmt_first) | Выполняет выражение и возвращает первую строку |
| [`st:sql`](statement.md#stmt_sql)     | Исходный текст запроса                         |
| [`st:close`](statement.md#stmt_close) | Освобождает выражение                          |
