# 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"
}