datavoxel


Namedatavoxel JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryType-Safe Modern ORM - Data in 3D
upload_time2025-10-29 09:34:48
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT License Copyright (c) 2024 Juste Elysée MALANDILA Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords async database orm prisma sql sqlalchemy type-safe
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">

```
██████╗  █████╗ ████████╗ █████╗ ██╗   ██╗ ██████╗ ██╗  ██╗███████╗██╗     
██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗██║   ██║██╔═══██╗╚██╗██╔╝██╔════╝██║     
██║  ██║███████║   ██║   ███████║██║   ██║██║   ██║ ╚███╔╝ █████╗  ██║     
██║  ██║██╔══██║   ██║   ██╔══██║╚██╗ ██╔╝██║   ██║ ██╔██╗ ██╔══╝  ██║     
██████╔╝██║  ██║   ██║   ██║  ██║ ╚████╔╝ ╚██████╔╝██╔╝ ██╗███████╗███████╗
╚═════╝ ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝  ╚═══╝   ╚═════╝ ╚═╝  ╚═╝╚══════╝╚══════╝
```

### 🗄️ *Type-Safe Modern ORM* 🗄️

<p align="center">
  <strong>Data in 3D - Where Database Queries Feel Like Magic</strong>
</p>

[![PyPI version](https://img.shields.io/pypi/v/datavoxel?color=blue&style=for-the-badge)](https://pypi.org/project/datavoxel/)
[![Python Versions](https://img.shields.io/pypi/pyversions/datavoxel?style=for-the-badge)](https://pypi.org/project/datavoxel/)
[![License](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](https://opensource.org/licenses/MIT)
[![Downloads](https://img.shields.io/pypi/dm/datavoxel?style=for-the-badge&color=orange)](https://pepy.tech/project/datavoxel)

[![Type Checked](https://img.shields.io/badge/type%20checked-mypy-blue?style=for-the-badge)](http://mypy-lang.org/)
[![Async Ready](https://img.shields.io/badge/async-ready-brightgreen?style=for-the-badge)]()
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge)](https://github.com/psf/black)

<p align="center">
  <a href="#-quick-start">Quick Start</a> •
  <a href="#-features">Features</a> •
  <a href="#-examples">Examples</a> •
  <a href="#-documentation">Documentation</a>
</p>

![Separator](https://user-images.githubusercontent.com/74038190/212284100-561aa473-3905-4a80-b561-0d28506553ee.gif)

</div>

## 🌟 What is DATAVOXEL?

**DATAVOXEL** is a revolutionary ORM that thinks in **3 dimensions**: **Type Safety**, **Developer Experience**, and **Performance**. Built on SQLAlchemy but with a modern twist, it makes database operations feel **natural** and **intuitive**.

```python
from datavoxel import Model, Query

class User(Model):
    __table__ = "users"
    
    id: int
    name: str
    email: str
    created_at: datetime

# Type-safe queries with IDE autocomplete!
users = Query(User).where(User.age > 18).order_by(User.name).limit(10).all()
# 🎯 Your IDE knows exactly what type 'users' is!
```

---

## ✨ Key Features

<table>
<tr>
<td width="50%">

### 🎯 Type Safety
- ✅ **Full Type Hints** - IDE autocomplete everywhere
- 🔍 **Mypy Compatible** - Catch errors before runtime
- 📝 **IntelliSense** - See available fields instantly
- 🛡️ **Compile-Time Checks** - No more typos

</td>
<td width="50%">

### ⚡ Performance
- 🚀 **Async First** - Built for async/await
- 🔄 **Connection Pooling** - Reuse connections
- 💾 **Query Caching** - Automatic optimization
- 📊 **Lazy Loading** - Load data when needed

</td>
</tr>
<tr>
<td width="50%">

### 🎨 Developer Experience
- 💡 **Intuitive API** - Reads like English
- 🔗 **Method Chaining** - Build queries naturally
- 🏗️ **Auto Migrations** - Schema changes made easy
- 📚 **Rich Documentation** - Examples for everything

</td>
<td width="50%">

### 🏗️ Production Ready
- ✅ **Battle Tested** - Built on SQLAlchemy
- 🔒 **SQL Injection Safe** - Parameterized queries
- 🌍 **Multi-DB Support** - Postgres, MySQL, SQLite
- 📈 **Scalable** - From MVP to millions of rows

</td>
</tr>
</table>

---

## 📦 Installation

```bash
# Basic installation (SQLite support)
pip install datavoxel

# With PostgreSQL support
pip install datavoxel[postgres]

# With MySQL support  
pip install datavoxel[mysql]

# With all database drivers
pip install datavoxel[all]
```

---

## 🎯 Quick Start

### Define Your Models

```python
from datavoxel import Model
from datetime import datetime
from typing import Optional

class User(Model):
    __table__ = "users"
    __database__ = "myapp"
    
    id: int
    username: str
    email: str
    is_active: bool = True
    created_at: datetime = datetime.now()
    bio: Optional[str] = None
```

### Simple CRUD Operations

```python
# Create
user = User(username="john_doe", email="john@example.com")
await user.save()

# Read
user = await User.get(id=1)
users = await User.filter(is_active=True).all()

# Update
user.email = "newemail@example.com"
await user.save()

# Delete
await user.delete()
```

### Advanced Queries

```python
from datavoxel import Query, Q

# Complex WHERE clauses
active_users = await Query(User).where(
    (User.is_active == True) & 
    (User.created_at > datetime(2024, 1, 1))
).all()

# Joins
class Post(Model):
    __table__ = "posts"
    user_id: int
    title: str
    content: str

posts_with_users = await Query(Post).join(
    User, Post.user_id == User.id
).select(Post.title, User.username).all()

# Aggregations
from datavoxel import Count, Avg

user_count = await Query(User).aggregate(Count(User.id))
avg_age = await Query(User).aggregate(Avg(User.age))
```

---

## 🏗️ Architecture

```mermaid
graph TB
    A[Your Application] --> B[DATAVOXEL ORM]
    
    B --> C{Query Builder}
    B --> D{Model Manager}
    B --> E{Migration Engine}
    
    C --> F[Type Checker]
    C --> G[SQL Generator]
    
    D --> H[CRUD Operations]
    D --> I[Relationships]
    
    E --> J[Schema Diff]
    E --> K[Auto Migrate]
    
    F --> L[SQLAlchemy Core]
    G --> L
    H --> L
    I --> L
    J --> L
    K --> L
    
    L --> M{Database Driver}
    M --> N[PostgreSQL]
    M --> O[MySQL]
    M --> P[SQLite]
    
    style B fill:#2196F3
    style L fill:#4CAF50
```

---

## 🔥 Advanced Features

### Relationships

```python
class Author(Model):
    __table__ = "authors"
    id: int
    name: str

class Book(Model):
    __table__ = "books"
    id: int
    title: str
    author_id: int
    
    # Define relationship
    author = Relation(Author, foreign_key="author_id")

# Use relationships
book = await Book.get(id=1)
author = await book.author  # Automatically fetches author
print(f"{book.title} by {author.name}")
```

### Transactions

```python
from datavoxel import transaction

async with transaction():
    user = User(username="alice")
    await user.save()
    
    post = Post(title="First Post", user_id=user.id)
    await post.save()
    
    # Both saved or both rolled back together!
```

### Query Optimization

```python
# Eager loading (N+1 query prevention)
books = await Query(Book).prefetch(Book.author).all()
# Only 2 queries instead of N+1!

# Select only needed fields
users = await Query(User).only(User.id, User.username).all()
# Smaller result set = faster queries

# Bulk operations
await User.bulk_create([
    User(username="user1", email="user1@example.com"),
    User(username="user2", email="user2@example.com"),
])
```

### Custom Queries

```python
# Raw SQL when needed
results = await Query.raw("""
    SELECT users.name, COUNT(posts.id) as post_count
    FROM users
    LEFT JOIN posts ON users.id = posts.user_id
    GROUP BY users.id
    HAVING post_count > 10
""")
```

---

## 📊 Comparison with Other ORMs

| Feature | DATAVOXEL | SQLAlchemy | Django ORM | Peewee | Tortoise |
|---------|-----------|------------|------------|--------|----------|
| Type Safety | ✅ Full | ⚠️ Partial | ❌ No | ❌ No | ⚠️ Partial |
| Async Support | ✅ Native | ✅ Yes | ⚠️ Limited | ❌ No | ✅ Yes |
| Learning Curve | 🟢 Easy | 🔴 Hard | 🟢 Easy | 🟢 Easy | 🟡 Medium |
| Auto Migrations | ✅ Built-in | ⚠️ Alembic | ✅ Yes | ❌ No | ✅ Yes |
| IDE Support | ⚡⚡⚡⚡⚡ | ⚡⚡ | ⚡⚡ | ⚡⚡ | ⚡⚡⚡ |
| Performance | ⚡⚡⚡⚡ | ⚡⚡⚡⚡⚡ | ⚡⚡⚡ | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ |

---

## 🎨 Real-World Examples

### FastAPI Integration

```python
from fastapi import FastAPI, Depends
from datavoxel import Model, Query

app = FastAPI()

class User(Model):
    __table__ = "users"
    id: int
    username: str
    email: str

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    user = await User.get(id=user_id)
    return user.dict()  # Automatic serialization!

@app.get("/users")
async def list_users(skip: int = 0, limit: int = 10):
    users = await Query(User).offset(skip).limit(limit).all()
    return [user.dict() for user in users]
```

### Data Pipeline

```python
from datavoxel import Model, transaction
import asyncio

class RawData(Model):
    __table__ = "raw_data"
    id: int
    data: str

class ProcessedData(Model):
    __table__ = "processed_data"
    id: int
    result: str

async def process_data():
    raw_items = await Query(RawData).filter(processed=False).all()
    
    async with transaction():
        for item in raw_items:
            # Process data
            result = transform(item.data)
            
            # Save result
            processed = ProcessedData(result=result)
            await processed.save()
            
            # Mark as processed
            item.processed = True
            await item.save()
```

### Multi-Tenant App

```python
from datavoxel import Model, set_schema

class Tenant(Model):
    __table__ = "tenants"
    id: int
    schema_name: str

class User(Model):
    __table__ = "users"
    __schema_bound__ = True  # Uses current schema
    id: int
    name: str

async def get_tenant_users(tenant_id: int):
    tenant = await Tenant.get(id=tenant_id)
    
    # Switch to tenant schema
    set_schema(tenant.schema_name)
    
    # Query tenant-specific data
    users = await Query(User).all()
    return users
```

---

## 📚 Documentation

- 📖 [Full API Reference](https://datavoxel.readthedocs.io)
- 🚀 [Quick Start Guide](https://datavoxel.readthedocs.io/quickstart)
- 🎓 [Tutorial](https://datavoxel.readthedocs.io/tutorial)
- 🏗️ [Migrations Guide](https://datavoxel.readthedocs.io/migrations)
- 🎯 [Best Practices](https://datavoxel.readthedocs.io/best-practices)

---

## 🗺️ Roadmap

### ✅ Version 0.1.0 (Current)
- [x] Type-safe models
- [x] Basic CRUD operations
- [x] Query builder
- [x] Async support

### 🚧 Version 0.2.0 (Coming Soon)
- [ ] Auto migrations
- [ ] Relationship support
- [ ] Connection pooling
- [ ] Query caching

### 🔮 Version 0.3.0 (Planned)
- [ ] Advanced relationships (M2M, polymorphic)
- [ ] Full-text search
- [ ] Database sharding
- [ ] Performance monitoring
- [ ] GraphQL integration

---

## 🤝 Contributing

Contributions welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

---

## 📜 License

MIT License - see [LICENSE](LICENSE) file for details.

---

## 👤 Author

<div align="center">

### **Juste Elysée MALANDILA**

[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://linkedin.com/in/juste-elysee-malandila)
[![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge&logo=gmail&logoColor=white)](mailto:justech4dev@gmail.com)
[![GitHub](https://img.shields.io/badge/GitHub-100000?style=for-the-badge&logo=github&logoColor=white)](https://github.com/jdevsky)

*"Making databases feel like magic."* 🗄️

</div>

---

<div align="center">

### Made with ❤️ by [Juste Elysée MALANDILA](https://linkedin.com/in/juste-elysee-malandila)

**DATAVOXEL** - *Data in 3D* 🗄️

![Footer](https://capsule-render.vercel.app/api?type=waving&color=gradient&height=100&section=footer)

</div>

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "datavoxel",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "async, database, orm, prisma, sql, sqlalchemy, type-safe",
    "author": null,
    "author_email": "Juste Elys\u00e9e MALANDILA <justech4dev@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/ea/53/0cbe5dc2099e1b0ff37c1eec2c37da997d748fbb699798e024ccf563e65b/datavoxel-0.2.0.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\n\n```\n\u2588\u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557   \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557  \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557     \n\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255a\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255d\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u255a\u2588\u2588\u2557\u2588\u2588\u2554\u255d\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2551     \n\u2588\u2588\u2551  \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551   \u2588\u2588\u2551   \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2551   \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2551     \n\u2588\u2588\u2551  \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551   \u2588\u2588\u2551   \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d\u2588\u2588\u2551   \u2588\u2588\u2551 \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2554\u2550\u2550\u255d  \u2588\u2588\u2551     \n\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551  \u2588\u2588\u2551   \u2588\u2588\u2551   \u2588\u2588\u2551  \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2554\u255d \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\n\u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d  \u255a\u2550\u255d   \u255a\u2550\u255d   \u255a\u2550\u255d  \u255a\u2550\u255d  \u255a\u2550\u2550\u2550\u255d   \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d  \u255a\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n```\n\n### \ud83d\uddc4\ufe0f *Type-Safe Modern ORM* \ud83d\uddc4\ufe0f\n\n<p align=\"center\">\n  <strong>Data in 3D - Where Database Queries Feel Like Magic</strong>\n</p>\n\n[![PyPI version](https://img.shields.io/pypi/v/datavoxel?color=blue&style=for-the-badge)](https://pypi.org/project/datavoxel/)\n[![Python Versions](https://img.shields.io/pypi/pyversions/datavoxel?style=for-the-badge)](https://pypi.org/project/datavoxel/)\n[![License](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](https://opensource.org/licenses/MIT)\n[![Downloads](https://img.shields.io/pypi/dm/datavoxel?style=for-the-badge&color=orange)](https://pepy.tech/project/datavoxel)\n\n[![Type Checked](https://img.shields.io/badge/type%20checked-mypy-blue?style=for-the-badge)](http://mypy-lang.org/)\n[![Async Ready](https://img.shields.io/badge/async-ready-brightgreen?style=for-the-badge)]()\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge)](https://github.com/psf/black)\n\n<p align=\"center\">\n  <a href=\"#-quick-start\">Quick Start</a> \u2022\n  <a href=\"#-features\">Features</a> \u2022\n  <a href=\"#-examples\">Examples</a> \u2022\n  <a href=\"#-documentation\">Documentation</a>\n</p>\n\n![Separator](https://user-images.githubusercontent.com/74038190/212284100-561aa473-3905-4a80-b561-0d28506553ee.gif)\n\n</div>\n\n## \ud83c\udf1f What is DATAVOXEL?\n\n**DATAVOXEL** is a revolutionary ORM that thinks in **3 dimensions**: **Type Safety**, **Developer Experience**, and **Performance**. Built on SQLAlchemy but with a modern twist, it makes database operations feel **natural** and **intuitive**.\n\n```python\nfrom datavoxel import Model, Query\n\nclass User(Model):\n    __table__ = \"users\"\n    \n    id: int\n    name: str\n    email: str\n    created_at: datetime\n\n# Type-safe queries with IDE autocomplete!\nusers = Query(User).where(User.age > 18).order_by(User.name).limit(10).all()\n# \ud83c\udfaf Your IDE knows exactly what type 'users' is!\n```\n\n---\n\n## \u2728 Key Features\n\n<table>\n<tr>\n<td width=\"50%\">\n\n### \ud83c\udfaf Type Safety\n- \u2705 **Full Type Hints** - IDE autocomplete everywhere\n- \ud83d\udd0d **Mypy Compatible** - Catch errors before runtime\n- \ud83d\udcdd **IntelliSense** - See available fields instantly\n- \ud83d\udee1\ufe0f **Compile-Time Checks** - No more typos\n\n</td>\n<td width=\"50%\">\n\n### \u26a1 Performance\n- \ud83d\ude80 **Async First** - Built for async/await\n- \ud83d\udd04 **Connection Pooling** - Reuse connections\n- \ud83d\udcbe **Query Caching** - Automatic optimization\n- \ud83d\udcca **Lazy Loading** - Load data when needed\n\n</td>\n</tr>\n<tr>\n<td width=\"50%\">\n\n### \ud83c\udfa8 Developer Experience\n- \ud83d\udca1 **Intuitive API** - Reads like English\n- \ud83d\udd17 **Method Chaining** - Build queries naturally\n- \ud83c\udfd7\ufe0f **Auto Migrations** - Schema changes made easy\n- \ud83d\udcda **Rich Documentation** - Examples for everything\n\n</td>\n<td width=\"50%\">\n\n### \ud83c\udfd7\ufe0f Production Ready\n- \u2705 **Battle Tested** - Built on SQLAlchemy\n- \ud83d\udd12 **SQL Injection Safe** - Parameterized queries\n- \ud83c\udf0d **Multi-DB Support** - Postgres, MySQL, SQLite\n- \ud83d\udcc8 **Scalable** - From MVP to millions of rows\n\n</td>\n</tr>\n</table>\n\n---\n\n## \ud83d\udce6 Installation\n\n```bash\n# Basic installation (SQLite support)\npip install datavoxel\n\n# With PostgreSQL support\npip install datavoxel[postgres]\n\n# With MySQL support  \npip install datavoxel[mysql]\n\n# With all database drivers\npip install datavoxel[all]\n```\n\n---\n\n## \ud83c\udfaf Quick Start\n\n### Define Your Models\n\n```python\nfrom datavoxel import Model\nfrom datetime import datetime\nfrom typing import Optional\n\nclass User(Model):\n    __table__ = \"users\"\n    __database__ = \"myapp\"\n    \n    id: int\n    username: str\n    email: str\n    is_active: bool = True\n    created_at: datetime = datetime.now()\n    bio: Optional[str] = None\n```\n\n### Simple CRUD Operations\n\n```python\n# Create\nuser = User(username=\"john_doe\", email=\"john@example.com\")\nawait user.save()\n\n# Read\nuser = await User.get(id=1)\nusers = await User.filter(is_active=True).all()\n\n# Update\nuser.email = \"newemail@example.com\"\nawait user.save()\n\n# Delete\nawait user.delete()\n```\n\n### Advanced Queries\n\n```python\nfrom datavoxel import Query, Q\n\n# Complex WHERE clauses\nactive_users = await Query(User).where(\n    (User.is_active == True) & \n    (User.created_at > datetime(2024, 1, 1))\n).all()\n\n# Joins\nclass Post(Model):\n    __table__ = \"posts\"\n    user_id: int\n    title: str\n    content: str\n\nposts_with_users = await Query(Post).join(\n    User, Post.user_id == User.id\n).select(Post.title, User.username).all()\n\n# Aggregations\nfrom datavoxel import Count, Avg\n\nuser_count = await Query(User).aggregate(Count(User.id))\navg_age = await Query(User).aggregate(Avg(User.age))\n```\n\n---\n\n## \ud83c\udfd7\ufe0f Architecture\n\n```mermaid\ngraph TB\n    A[Your Application] --> B[DATAVOXEL ORM]\n    \n    B --> C{Query Builder}\n    B --> D{Model Manager}\n    B --> E{Migration Engine}\n    \n    C --> F[Type Checker]\n    C --> G[SQL Generator]\n    \n    D --> H[CRUD Operations]\n    D --> I[Relationships]\n    \n    E --> J[Schema Diff]\n    E --> K[Auto Migrate]\n    \n    F --> L[SQLAlchemy Core]\n    G --> L\n    H --> L\n    I --> L\n    J --> L\n    K --> L\n    \n    L --> M{Database Driver}\n    M --> N[PostgreSQL]\n    M --> O[MySQL]\n    M --> P[SQLite]\n    \n    style B fill:#2196F3\n    style L fill:#4CAF50\n```\n\n---\n\n## \ud83d\udd25 Advanced Features\n\n### Relationships\n\n```python\nclass Author(Model):\n    __table__ = \"authors\"\n    id: int\n    name: str\n\nclass Book(Model):\n    __table__ = \"books\"\n    id: int\n    title: str\n    author_id: int\n    \n    # Define relationship\n    author = Relation(Author, foreign_key=\"author_id\")\n\n# Use relationships\nbook = await Book.get(id=1)\nauthor = await book.author  # Automatically fetches author\nprint(f\"{book.title} by {author.name}\")\n```\n\n### Transactions\n\n```python\nfrom datavoxel import transaction\n\nasync with transaction():\n    user = User(username=\"alice\")\n    await user.save()\n    \n    post = Post(title=\"First Post\", user_id=user.id)\n    await post.save()\n    \n    # Both saved or both rolled back together!\n```\n\n### Query Optimization\n\n```python\n# Eager loading (N+1 query prevention)\nbooks = await Query(Book).prefetch(Book.author).all()\n# Only 2 queries instead of N+1!\n\n# Select only needed fields\nusers = await Query(User).only(User.id, User.username).all()\n# Smaller result set = faster queries\n\n# Bulk operations\nawait User.bulk_create([\n    User(username=\"user1\", email=\"user1@example.com\"),\n    User(username=\"user2\", email=\"user2@example.com\"),\n])\n```\n\n### Custom Queries\n\n```python\n# Raw SQL when needed\nresults = await Query.raw(\"\"\"\n    SELECT users.name, COUNT(posts.id) as post_count\n    FROM users\n    LEFT JOIN posts ON users.id = posts.user_id\n    GROUP BY users.id\n    HAVING post_count > 10\n\"\"\")\n```\n\n---\n\n## \ud83d\udcca Comparison with Other ORMs\n\n| Feature | DATAVOXEL | SQLAlchemy | Django ORM | Peewee | Tortoise |\n|---------|-----------|------------|------------|--------|----------|\n| Type Safety | \u2705 Full | \u26a0\ufe0f Partial | \u274c No | \u274c No | \u26a0\ufe0f Partial |\n| Async Support | \u2705 Native | \u2705 Yes | \u26a0\ufe0f Limited | \u274c No | \u2705 Yes |\n| Learning Curve | \ud83d\udfe2 Easy | \ud83d\udd34 Hard | \ud83d\udfe2 Easy | \ud83d\udfe2 Easy | \ud83d\udfe1 Medium |\n| Auto Migrations | \u2705 Built-in | \u26a0\ufe0f Alembic | \u2705 Yes | \u274c No | \u2705 Yes |\n| IDE Support | \u26a1\u26a1\u26a1\u26a1\u26a1 | \u26a1\u26a1 | \u26a1\u26a1 | \u26a1\u26a1 | \u26a1\u26a1\u26a1 |\n| Performance | \u26a1\u26a1\u26a1\u26a1 | \u26a1\u26a1\u26a1\u26a1\u26a1 | \u26a1\u26a1\u26a1 | \u26a1\u26a1\u26a1\u26a1 | \u26a1\u26a1\u26a1\u26a1 |\n\n---\n\n## \ud83c\udfa8 Real-World Examples\n\n### FastAPI Integration\n\n```python\nfrom fastapi import FastAPI, Depends\nfrom datavoxel import Model, Query\n\napp = FastAPI()\n\nclass User(Model):\n    __table__ = \"users\"\n    id: int\n    username: str\n    email: str\n\n@app.get(\"/users/{user_id}\")\nasync def get_user(user_id: int):\n    user = await User.get(id=user_id)\n    return user.dict()  # Automatic serialization!\n\n@app.get(\"/users\")\nasync def list_users(skip: int = 0, limit: int = 10):\n    users = await Query(User).offset(skip).limit(limit).all()\n    return [user.dict() for user in users]\n```\n\n### Data Pipeline\n\n```python\nfrom datavoxel import Model, transaction\nimport asyncio\n\nclass RawData(Model):\n    __table__ = \"raw_data\"\n    id: int\n    data: str\n\nclass ProcessedData(Model):\n    __table__ = \"processed_data\"\n    id: int\n    result: str\n\nasync def process_data():\n    raw_items = await Query(RawData).filter(processed=False).all()\n    \n    async with transaction():\n        for item in raw_items:\n            # Process data\n            result = transform(item.data)\n            \n            # Save result\n            processed = ProcessedData(result=result)\n            await processed.save()\n            \n            # Mark as processed\n            item.processed = True\n            await item.save()\n```\n\n### Multi-Tenant App\n\n```python\nfrom datavoxel import Model, set_schema\n\nclass Tenant(Model):\n    __table__ = \"tenants\"\n    id: int\n    schema_name: str\n\nclass User(Model):\n    __table__ = \"users\"\n    __schema_bound__ = True  # Uses current schema\n    id: int\n    name: str\n\nasync def get_tenant_users(tenant_id: int):\n    tenant = await Tenant.get(id=tenant_id)\n    \n    # Switch to tenant schema\n    set_schema(tenant.schema_name)\n    \n    # Query tenant-specific data\n    users = await Query(User).all()\n    return users\n```\n\n---\n\n## \ud83d\udcda Documentation\n\n- \ud83d\udcd6 [Full API Reference](https://datavoxel.readthedocs.io)\n- \ud83d\ude80 [Quick Start Guide](https://datavoxel.readthedocs.io/quickstart)\n- \ud83c\udf93 [Tutorial](https://datavoxel.readthedocs.io/tutorial)\n- \ud83c\udfd7\ufe0f [Migrations Guide](https://datavoxel.readthedocs.io/migrations)\n- \ud83c\udfaf [Best Practices](https://datavoxel.readthedocs.io/best-practices)\n\n---\n\n## \ud83d\uddfa\ufe0f Roadmap\n\n### \u2705 Version 0.1.0 (Current)\n- [x] Type-safe models\n- [x] Basic CRUD operations\n- [x] Query builder\n- [x] Async support\n\n### \ud83d\udea7 Version 0.2.0 (Coming Soon)\n- [ ] Auto migrations\n- [ ] Relationship support\n- [ ] Connection pooling\n- [ ] Query caching\n\n### \ud83d\udd2e Version 0.3.0 (Planned)\n- [ ] Advanced relationships (M2M, polymorphic)\n- [ ] Full-text search\n- [ ] Database sharding\n- [ ] Performance monitoring\n- [ ] GraphQL integration\n\n---\n\n## \ud83e\udd1d Contributing\n\nContributions welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n---\n\n## \ud83d\udcdc License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n---\n\n## \ud83d\udc64 Author\n\n<div align=\"center\">\n\n### **Juste Elys\u00e9e MALANDILA**\n\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://linkedin.com/in/juste-elysee-malandila)\n[![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge&logo=gmail&logoColor=white)](mailto:justech4dev@gmail.com)\n[![GitHub](https://img.shields.io/badge/GitHub-100000?style=for-the-badge&logo=github&logoColor=white)](https://github.com/jdevsky)\n\n*\"Making databases feel like magic.\"* \ud83d\uddc4\ufe0f\n\n</div>\n\n---\n\n<div align=\"center\">\n\n### Made with \u2764\ufe0f by [Juste Elys\u00e9e MALANDILA](https://linkedin.com/in/juste-elysee-malandila)\n\n**DATAVOXEL** - *Data in 3D* \ud83d\uddc4\ufe0f\n\n![Footer](https://capsule-render.vercel.app/api?type=waving&color=gradient&height=100&section=footer)\n\n</div>\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2024 Juste Elys\u00e9e MALANDILA\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.",
    "summary": "Type-Safe Modern ORM - Data in 3D",
    "version": "0.2.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/jdevsky/datavoxel/issues",
        "Documentation": "https://github.com/jdevsky/datavoxel#readme",
        "Homepage": "https://github.com/jdevsky/datavoxel",
        "Repository": "https://github.com/jdevsky/datavoxel.git"
    },
    "split_keywords": [
        "async",
        " database",
        " orm",
        " prisma",
        " sql",
        " sqlalchemy",
        " type-safe"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "083fd466b8e134231bc03d8f9fd7ecfa38d1c5ebfc27dea62c3bdf568f69066b",
                "md5": "c317d9ccb7f4d51cb3c83690ac687a74",
                "sha256": "9703bb0c45f04168b84b1cf9840fab21a543186478551f1206bef37f0e915544"
            },
            "downloads": -1,
            "filename": "datavoxel-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c317d9ccb7f4d51cb3c83690ac687a74",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 10483,
            "upload_time": "2025-10-29T09:34:47",
            "upload_time_iso_8601": "2025-10-29T09:34:47.159364Z",
            "url": "https://files.pythonhosted.org/packages/08/3f/d466b8e134231bc03d8f9fd7ecfa38d1c5ebfc27dea62c3bdf568f69066b/datavoxel-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ea530cbe5dc2099e1b0ff37c1eec2c37da997d748fbb699798e024ccf563e65b",
                "md5": "6489c5dbd5288a76b531b8b7bd43f6bf",
                "sha256": "1196d588e174df59d18ec9a7939a70d271aac8053622a43c974b955e5d9bc749"
            },
            "downloads": -1,
            "filename": "datavoxel-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6489c5dbd5288a76b531b8b7bd43f6bf",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 11696,
            "upload_time": "2025-10-29T09:34:48",
            "upload_time_iso_8601": "2025-10-29T09:34:48.576457Z",
            "url": "https://files.pythonhosted.org/packages/ea/53/0cbe5dc2099e1b0ff37c1eec2c37da997d748fbb699798e024ccf563e65b/datavoxel-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-29 09:34:48",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jdevsky",
    "github_project": "datavoxel",
    "github_not_found": true,
    "lcname": "datavoxel"
}
        
Elapsed time: 1.97239s