valtdb


Namevaltdb JSON
Version 1.0.0 PyPI version JSON
download
home_pagehttps://github.com/DevsBenji/valtdb
SummaryA secure and flexible database library with encryption and remote access
upload_time2024-12-22 18:28:39
maintainerNone
docs_urlNone
authorDevsBenji
requires_python>=3.8
licenseNone
keywords database encryption secure-database nosql embedded-database key-value-store document-database database-security encrypted-storage secure-communication database-tools python3 data-storage crypto
VCS
bugtrack_url
requirements cryptography paramiko bcrypt PyJWT argon2-cffi pynacl requests aiohttp python-dateutil typing-extensions
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ValtDB

ValtDB - это современная, безопасная и высокопроизводительная база данных, написанная на Python. Она предоставляет интуитивно понятный API для работы с данными, поддерживает шифрование и предлагает широкие возможности для запросов.

## Особенности

- 🚀 Высокая производительность и оптимизация
- 🔒 Встроенное шифрование данных
- 🎯 Интуитивный и удобный API
- 📊 Продвинутый построитель запросов
- 🔄 Поддержка транзакций
- 📦 Простая установка и использование
- 🛡️ Безопасность и контроль доступа
- 🔍 Гибкие возможности поиска и фильтрации

## Установка

```bash
pip install valtdb
```

## Быстрый старт

### Инициализация и создание базы данных

```python
from valtdb.api import ValtDB

# Создание экземпляра ValtDB
db = ValtDB("./data")

# Создание базы данных
db.db("myapp")

# Создание зашифрованной базы данных
secure_db = db.db("secure_app", {
    "algorithm": "AES",
    "hash_algorithm": "SHA256"
})
```

### Создание и определение таблиц

```python
# Простая таблица
users = db.table("users", {
    "id": "int",
    "name": "str",
    "email": "str"
})

# Расширенное определение схемы
posts = db.table("posts", {
    "id": {"type": "int", "required": True, "unique": True},
    "title": {"type": "str", "required": True},
    "content": {"type": "str", "encrypted": True},
    "status": {"type": "str", "choices": ["draft", "published", "archived"]},
    "views": {"type": "int", "default": 0},
    "created_at": {"type": "datetime", "auto_now": True},
    "tags": {"type": "list", "item_type": "str"}
})
```

### Базовые операции с данными

```python
# Вставка одной записи
users.insert({
    "id": 1,
    "name": "John Doe",
    "email": "john@example.com"
})

# Массовая вставка
users.bulk_insert([
    {"id": 2, "name": "Jane Doe", "email": "jane@example.com"},
    {"id": 3, "name": "Bob Smith", "email": "bob@example.com"}
])

# Обновление
users.query().where(id=1).update({"name": "John Smith"})

# Удаление
users.query().where(email="john@example.com").delete()
```

## Продвинутые возможности

### Построитель запросов

#### Базовые запросы

```python
# Простой поиск
active_users = users.query()\
    .where(status="active")\
    .get()

# Выбор полей
names = users.query()\
    .select("name", "email")\
    .where(status="active")\
    .get()

# Сортировка
sorted_users = users.query()\
    .order_by("name", SortOrder.ASC)\
    .get()
```

#### Сложные условия

```python
# Множественные условия
results = users.query()\
    .where(status="active")\
    .where_between("age", 18, 65)\
    .where_not_null("email")\
    .where_like("name", "%John%")\
    .get()

# OR условия
results = users.query()\
    .where(role="admin")\
    .or_where(status="premium")\
    .get()

# IN условия
results = users.query()\
    .where_in("status", ["active", "pending"])\
    .get()

# Сложные фильтры
premium_active_users = users.query()\
    .where(status="active")\
    .where(subscription="premium")\
    .where_greater("last_login", "2024-01-01")\
    .where_not_in("role", ["banned", "suspended"])\
    .get()
```

#### Агрегация и группировка

```python
# Подсчет
total = users.query().count()

# Среднее значение
avg_age = users.query()\
    .where(status="active")\
    .avg("age")

# Группировка
stats = users.query()\
    .select("country", db.raw("COUNT(*) as user_count"))\
    .group_by("country")\
    .having("user_count", ("GT", 100))\
    .get()

# Сложная агрегация
user_stats = users.query()\
    .select(
        "department",
        db.raw("AVG(salary) as avg_salary"),
        db.raw("COUNT(*) as employee_count")
    )\
    .group_by("department")\
    .having("employee_count", ("GT", 5))\
    .order_by("avg_salary", SortOrder.DESC)\
    .get()
```

#### Соединения таблиц

```python
# INNER JOIN
user_posts = users.query()\
    .select("users.name", "posts.title")\
    .join("posts", {"users.id": "posts.user_id"})\
    .where("posts.status", "published")\
    .get()

# LEFT JOIN с условиями
results = users.query()\
    .select("users.*", "orders.total")\
    .left_join("orders", {"users.id": "orders.user_id"})\
    .where("users.status", "active")\
    .where_greater("orders.total", 1000)\
    .get()
```

### Транзакции

```python
# Простая транзакция
with db.transaction():
    user_id = users.insert_get_id({
        "name": "New User",
        "email": "new@example.com"
    })
    posts.insert({
        "user_id": user_id,
        "title": "First Post"
    })

# Обработка ошибок в транзакции
try:
    with db.transaction():
        users.insert({"id": 1, "name": "Test"})
        posts.insert({"id": 1, "invalid": "data"})
except Exception:
    print("Транзакция отменена")
```

### Пагинация и чанки

```python
# Простая пагинация
posts, meta = posts.query()\
    .where(status="published")\
    .order_by("created_at", SortOrder.DESC)\
    .paginate(page=2, per_page=20)

print(f"Showing {meta['from']} to {meta['to']} of {meta['total']} entries")

# Обработка больших наборов данных
users.query()\
    .where(status="active")\
    .chunk(100, lambda batch: process_users(batch))
```

### Шифрование данных

```python
# Создание таблицы с шифрованием
secure_users = db.table("secure_users", {
    "id": "int",
    "name": "str",
    "email": {"type": "str", "encrypted": True},
    "ssn": {"type": "str", "encrypted": True},
    "notes": {"type": "str", "encrypted": True}
})

# Работа с зашифрованными данными
secure_users.insert({
    "id": 1,
    "name": "John Doe",
    "email": "john@example.com",
    "ssn": "123-45-6789",
    "notes": "Конфиденциальная информация"
})
```

### Бэкапы и восстановление

```python
# Создание бэкапа
backup_file = db.backup("./backups")

# Восстановление из бэкапа
db.restore(backup_file)
```

### Сырые запросы

```python
# Выполнение сырого SQL
results = db.execute(
    "SELECT users.*, COUNT(orders.id) as order_count " +
    "FROM users " +
    "LEFT JOIN orders ON users.id = orders.user_id " +
    "GROUP BY users.id " +
    "HAVING order_count > :min_orders",
    {"min_orders": 5}
)
```

## Обновления API

### Новые возможности
- Добавлен метод `exec_command` для выполнения команд через SSH.
- Поддержка новых параметров в методах работы с базой данных.

### Примеры использования

#### Выполнение команды через SSH
```python
from valtdb.ssh import SSHConnection

connection = SSHConnection(host='example.com', username='user', password='pass')
result = connection.exec_command('ls -la')
print(result)
```

## Вклад в проект

Мы приветствуем вклад в развитие ValtDB! Пожалуйста, ознакомьтесь с [руководством по внесению изменений](CONTRIBUTING.md).

## Лицензия

ValtDB распространяется под лицензией MIT. Подробности в файле [LICENSE](LICENSE).

## Поддержка

- 💬 [Telegram](https://t.me/DevBenji)

## Авторы

ValtDB разрабатывается и поддерживается [командой разработчиков](https://github.com/valtdb/valtdb/graphs/contributors).

## Теги

#python #database #encryption #secure-database #nosql #embedded-database #python-library #database-management #crypto #secure-storage #key-value-store #document-database #python-package #database-security #python3 #encrypted-storage #secure-communication #database-tools #python-development #data-storage

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/DevsBenji/valtdb",
    "name": "valtdb",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "database, encryption, secure-database, nosql, embedded-database, key-value-store, document-database, database-security, encrypted-storage, secure-communication, database-tools, python3, data-storage, crypto",
    "author": "DevsBenji",
    "author_email": "benji.development@protonmail.com",
    "download_url": "https://files.pythonhosted.org/packages/31/7e/234b7b080cbc3925596c5b595db27dd6c6c244822e5ba8a89dd100cf0ee2/valtdb-1.0.0.tar.gz",
    "platform": null,
    "description": "# ValtDB\r\n\r\nValtDB - \u044d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 Python. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\r\n\r\n## \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438\r\n\r\n- \ud83d\ude80 \u0412\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\r\n- \ud83d\udd12 \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\r\n- \ud83c\udfaf \u0418\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 API\r\n- \ud83d\udcca \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\r\n- \ud83d\udd04 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439\r\n- \ud83d\udce6 \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\r\n- \ud83d\udee1\ufe0f \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430\r\n- \ud83d\udd0d \u0413\u0438\u0431\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438\r\n\r\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\r\n\r\n```bash\r\npip install valtdb\r\n```\r\n\r\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\r\n\r\n### \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\r\n\r\n```python\r\nfrom valtdb.api import ValtDB\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 ValtDB\r\ndb = ValtDB(\"./data\")\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\r\ndb.db(\"myapp\")\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\r\nsecure_db = db.db(\"secure_app\", {\r\n    \"algorithm\": \"AES\",\r\n    \"hash_algorithm\": \"SHA256\"\r\n})\r\n```\r\n\r\n### \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\r\n\r\n```python\r\n# \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\r\nusers = db.table(\"users\", {\r\n    \"id\": \"int\",\r\n    \"name\": \"str\",\r\n    \"email\": \"str\"\r\n})\r\n\r\n# \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b\r\nposts = db.table(\"posts\", {\r\n    \"id\": {\"type\": \"int\", \"required\": True, \"unique\": True},\r\n    \"title\": {\"type\": \"str\", \"required\": True},\r\n    \"content\": {\"type\": \"str\", \"encrypted\": True},\r\n    \"status\": {\"type\": \"str\", \"choices\": [\"draft\", \"published\", \"archived\"]},\r\n    \"views\": {\"type\": \"int\", \"default\": 0},\r\n    \"created_at\": {\"type\": \"datetime\", \"auto_now\": True},\r\n    \"tags\": {\"type\": \"list\", \"item_type\": \"str\"}\r\n})\r\n```\r\n\r\n### \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\r\n\r\n```python\r\n# \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438\r\nusers.insert({\r\n    \"id\": 1,\r\n    \"name\": \"John Doe\",\r\n    \"email\": \"john@example.com\"\r\n})\r\n\r\n# \u041c\u0430\u0441\u0441\u043e\u0432\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430\r\nusers.bulk_insert([\r\n    {\"id\": 2, \"name\": \"Jane Doe\", \"email\": \"jane@example.com\"},\r\n    {\"id\": 3, \"name\": \"Bob Smith\", \"email\": \"bob@example.com\"}\r\n])\r\n\r\n# \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\r\nusers.query().where(id=1).update({\"name\": \"John Smith\"})\r\n\r\n# \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\r\nusers.query().where(email=\"john@example.com\").delete()\r\n```\r\n\r\n## \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\r\n\r\n### \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\r\n\r\n#### \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\r\n\r\n```python\r\n# \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\r\nactive_users = users.query()\\\r\n    .where(status=\"active\")\\\r\n    .get()\r\n\r\n# \u0412\u044b\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439\r\nnames = users.query()\\\r\n    .select(\"name\", \"email\")\\\r\n    .where(status=\"active\")\\\r\n    .get()\r\n\r\n# \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\r\nsorted_users = users.query()\\\r\n    .order_by(\"name\", SortOrder.ASC)\\\r\n    .get()\r\n```\r\n\r\n#### \u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\r\n\r\n```python\r\n# \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\r\nresults = users.query()\\\r\n    .where(status=\"active\")\\\r\n    .where_between(\"age\", 18, 65)\\\r\n    .where_not_null(\"email\")\\\r\n    .where_like(\"name\", \"%John%\")\\\r\n    .get()\r\n\r\n# OR \u0443\u0441\u043b\u043e\u0432\u0438\u044f\r\nresults = users.query()\\\r\n    .where(role=\"admin\")\\\r\n    .or_where(status=\"premium\")\\\r\n    .get()\r\n\r\n# IN \u0443\u0441\u043b\u043e\u0432\u0438\u044f\r\nresults = users.query()\\\r\n    .where_in(\"status\", [\"active\", \"pending\"])\\\r\n    .get()\r\n\r\n# \u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b\r\npremium_active_users = users.query()\\\r\n    .where(status=\"active\")\\\r\n    .where(subscription=\"premium\")\\\r\n    .where_greater(\"last_login\", \"2024-01-01\")\\\r\n    .where_not_in(\"role\", [\"banned\", \"suspended\"])\\\r\n    .get()\r\n```\r\n\r\n#### \u0410\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\r\n\r\n```python\r\n# \u041f\u043e\u0434\u0441\u0447\u0435\u0442\r\ntotal = users.query().count()\r\n\r\n# \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\r\navg_age = users.query()\\\r\n    .where(status=\"active\")\\\r\n    .avg(\"age\")\r\n\r\n# \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\r\nstats = users.query()\\\r\n    .select(\"country\", db.raw(\"COUNT(*) as user_count\"))\\\r\n    .group_by(\"country\")\\\r\n    .having(\"user_count\", (\"GT\", 100))\\\r\n    .get()\r\n\r\n# \u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\r\nuser_stats = users.query()\\\r\n    .select(\r\n        \"department\",\r\n        db.raw(\"AVG(salary) as avg_salary\"),\r\n        db.raw(\"COUNT(*) as employee_count\")\r\n    )\\\r\n    .group_by(\"department\")\\\r\n    .having(\"employee_count\", (\"GT\", 5))\\\r\n    .order_by(\"avg_salary\", SortOrder.DESC)\\\r\n    .get()\r\n```\r\n\r\n#### \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\r\n\r\n```python\r\n# INNER JOIN\r\nuser_posts = users.query()\\\r\n    .select(\"users.name\", \"posts.title\")\\\r\n    .join(\"posts\", {\"users.id\": \"posts.user_id\"})\\\r\n    .where(\"posts.status\", \"published\")\\\r\n    .get()\r\n\r\n# LEFT JOIN \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438\r\nresults = users.query()\\\r\n    .select(\"users.*\", \"orders.total\")\\\r\n    .left_join(\"orders\", {\"users.id\": \"orders.user_id\"})\\\r\n    .where(\"users.status\", \"active\")\\\r\n    .where_greater(\"orders.total\", 1000)\\\r\n    .get()\r\n```\r\n\r\n### \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438\r\n\r\n```python\r\n# \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\r\nwith db.transaction():\r\n    user_id = users.insert_get_id({\r\n        \"name\": \"New User\",\r\n        \"email\": \"new@example.com\"\r\n    })\r\n    posts.insert({\r\n        \"user_id\": user_id,\r\n        \"title\": \"First Post\"\r\n    })\r\n\r\n# \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438\r\ntry:\r\n    with db.transaction():\r\n        users.insert({\"id\": 1, \"name\": \"Test\"})\r\n        posts.insert({\"id\": 1, \"invalid\": \"data\"})\r\nexcept Exception:\r\n    print(\"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430\")\r\n```\r\n\r\n### \u041f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0438 \u0447\u0430\u043d\u043a\u0438\r\n\r\n```python\r\n# \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f\r\nposts, meta = posts.query()\\\r\n    .where(status=\"published\")\\\r\n    .order_by(\"created_at\", SortOrder.DESC)\\\r\n    .paginate(page=2, per_page=20)\r\n\r\nprint(f\"Showing {meta['from']} to {meta['to']} of {meta['total']} entries\")\r\n\r\n# \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\r\nusers.query()\\\r\n    .where(status=\"active\")\\\r\n    .chunk(100, lambda batch: process_users(batch))\r\n```\r\n\r\n### \u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\r\n\r\n```python\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\r\nsecure_users = db.table(\"secure_users\", {\r\n    \"id\": \"int\",\r\n    \"name\": \"str\",\r\n    \"email\": {\"type\": \"str\", \"encrypted\": True},\r\n    \"ssn\": {\"type\": \"str\", \"encrypted\": True},\r\n    \"notes\": {\"type\": \"str\", \"encrypted\": True}\r\n})\r\n\r\n# \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\r\nsecure_users.insert({\r\n    \"id\": 1,\r\n    \"name\": \"John Doe\",\r\n    \"email\": \"john@example.com\",\r\n    \"ssn\": \"123-45-6789\",\r\n    \"notes\": \"\u041a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\"\r\n})\r\n```\r\n\r\n### \u0411\u044d\u043a\u0430\u043f\u044b \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\r\n\r\n```python\r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u0430\r\nbackup_file = db.backup(\"./backups\")\r\n\r\n# \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u044d\u043a\u0430\u043f\u0430\r\ndb.restore(backup_file)\r\n```\r\n\r\n### \u0421\u044b\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\r\n\r\n```python\r\n# \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u044b\u0440\u043e\u0433\u043e SQL\r\nresults = db.execute(\r\n    \"SELECT users.*, COUNT(orders.id) as order_count \" +\r\n    \"FROM users \" +\r\n    \"LEFT JOIN orders ON users.id = orders.user_id \" +\r\n    \"GROUP BY users.id \" +\r\n    \"HAVING order_count > :min_orders\",\r\n    {\"min_orders\": 5}\r\n)\r\n```\r\n\r\n## \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f API\r\n\r\n### \u041d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\r\n- \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u0435\u0442\u043e\u0434 `exec_command` \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 SSH.\r\n- \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.\r\n\r\n### \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\r\n\r\n#### \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0447\u0435\u0440\u0435\u0437 SSH\r\n```python\r\nfrom valtdb.ssh import SSHConnection\r\n\r\nconnection = SSHConnection(host='example.com', username='user', password='pass')\r\nresult = connection.exec_command('ls -la')\r\nprint(result)\r\n```\r\n\r\n## \u0412\u043a\u043b\u0430\u0434 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\r\n\r\n\u041c\u044b \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u043c \u0432\u043a\u043b\u0430\u0434 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 ValtDB! \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439](CONTRIBUTING.md).\r\n\r\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\r\n\r\nValtDB \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 MIT. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 [LICENSE](LICENSE).\r\n\r\n## \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\r\n\r\n- \ud83d\udcac [Telegram](https://t.me/DevBenji)\r\n\r\n## \u0410\u0432\u0442\u043e\u0440\u044b\r\n\r\nValtDB \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f [\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432](https://github.com/valtdb/valtdb/graphs/contributors).\r\n\r\n## \u0422\u0435\u0433\u0438\r\n\r\n#python #database #encryption #secure-database #nosql #embedded-database #python-library #database-management #crypto #secure-storage #key-value-store #document-database #python-package #database-security #python3 #encrypted-storage #secure-communication #database-tools #python-development #data-storage\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A secure and flexible database library with encryption and remote access",
    "version": "1.0.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/DevsBenji/valtdb/issues",
        "Homepage": "https://github.com/DevsBenji/valtdb"
    },
    "split_keywords": [
        "database",
        " encryption",
        " secure-database",
        " nosql",
        " embedded-database",
        " key-value-store",
        " document-database",
        " database-security",
        " encrypted-storage",
        " secure-communication",
        " database-tools",
        " python3",
        " data-storage",
        " crypto"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f701a16feed40cf2e596cc7022bd5383c3b8116339077a920916f80e7ade8873",
                "md5": "3d8b5a614b0554b28a7894f3fe2970f4",
                "sha256": "0da3be31e29f70e9a4ed08f84340d5a4508cdd81ee1ba473e4a799c1b1b22df9"
            },
            "downloads": -1,
            "filename": "valtdb-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3d8b5a614b0554b28a7894f3fe2970f4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 39896,
            "upload_time": "2024-12-22T18:28:38",
            "upload_time_iso_8601": "2024-12-22T18:28:38.092533Z",
            "url": "https://files.pythonhosted.org/packages/f7/01/a16feed40cf2e596cc7022bd5383c3b8116339077a920916f80e7ade8873/valtdb-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "317e234b7b080cbc3925596c5b595db27dd6c6c244822e5ba8a89dd100cf0ee2",
                "md5": "17f23f45f230a8a2337912c02c8a61c7",
                "sha256": "48cff885f1688e0953b62524189e5fb521a26ec1110269a5e7d16a8954f8f650"
            },
            "downloads": -1,
            "filename": "valtdb-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "17f23f45f230a8a2337912c02c8a61c7",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 45548,
            "upload_time": "2024-12-22T18:28:39",
            "upload_time_iso_8601": "2024-12-22T18:28:39.897640Z",
            "url": "https://files.pythonhosted.org/packages/31/7e/234b7b080cbc3925596c5b595db27dd6c6c244822e5ba8a89dd100cf0ee2/valtdb-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-22 18:28:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "DevsBenji",
    "github_project": "valtdb",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "cryptography",
            "specs": [
                [
                    ">=",
                    "41.0.0"
                ]
            ]
        },
        {
            "name": "paramiko",
            "specs": [
                [
                    ">=",
                    "2.8.1"
                ]
            ]
        },
        {
            "name": "bcrypt",
            "specs": [
                [
                    ">=",
                    "3.2.0"
                ]
            ]
        },
        {
            "name": "PyJWT",
            "specs": [
                [
                    ">=",
                    "2.3.0"
                ]
            ]
        },
        {
            "name": "argon2-cffi",
            "specs": [
                [
                    ">=",
                    "21.3.0"
                ]
            ]
        },
        {
            "name": "pynacl",
            "specs": [
                [
                    ">=",
                    "1.4.0"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    ">=",
                    "2.31.0"
                ]
            ]
        },
        {
            "name": "aiohttp",
            "specs": [
                [
                    ">=",
                    "3.9.0"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    ">=",
                    "2.8.2"
                ]
            ]
        },
        {
            "name": "typing-extensions",
            "specs": [
                [
                    ">=",
                    "4.8.0"
                ]
            ]
        }
    ],
    "tox": true,
    "lcname": "valtdb"
}
        
Elapsed time: 2.33089s