Skip to main content

Unified database operations

Project description

Opyra

The "Buttery Smooth" Registry-Based ORM for Python.

Opyraa next-generation data layer built on top of msgspec. It unifies SQL (Postgres, SQLite) and NoSQL (MongoDB) under a single, ultra-fast, type-safe API using the Registry Pattern.

It eliminates "Global State" and "Boilerplate Fatigue" by using explicit Operation registries and "Bound Instances" ("The Bloodline").

PyPI version Python 3.10+ License: MIT


🚀 Why Opyra

  • Registry Pattern: Explicitly register schemas with an Operation engine. No magic globals.
  • Bound Instances: Objects know where they belong. user.save() just works because the user carries "The Bloodline" (the engine reference).
  • Dirty Tracking: Automatic change detection. Calling .save() only updates what changed (efficient UPDATE vs INSERT).
  • Universal API: Switch from SQLite to Postgres to Mongo without rewriting your model logic.
  • Blazing Fast: Built on msgspec (faster than Pydantic/JSON) and native async drivers (asyncpg, motor).

📦 Installation

pip install opyra

# Install drivers as needed:
pip install opyra[postgres]  # installs asyncpg
pip install opyra[mongo]     # installs motor
pip install opyra[sqlite]    # installs aiosqlite

⚡ Quickstart

1. Define your Schema

Inherit from Table (SQL) or Document (NoSQL). These are pure data structures (msgspec.Struct).

from opyra import Table, Document

class User(Table):
    id: int
    name: str
    email: str

2. Initialize the Operation

Create an engine and register your models. This is your "Database Context".

from opyra import Operation

op = Operation("postgres://user:pass@localhost:5432/mydb")
op.register(User) 
# Now available as 'op.user' (snake_case automation)

3. Use it!

Factory Access (Creating Data): Use op.user(...) to create a "Bound Instance".

# Create alice attached to this engine
alice = op.user(name="Alice", email="alice@example.com") 

# Save detects this is a NEW record (no ID) -> INSERT
await alice.save() 
print(alice.id) # ID is auto-populated

Repository Access (Querying Data): Use op.user.find(...) to search.

# Find by ID
user = await op.user.find(1)

# Find by Template (Fluent API)
users = await op.user(name="Alice").find()

Dirty Tracking (Updating Data): Modify fields naturally. Opyracks changes.

user.name = "Alice Wonder"
# Save detects EXISTING record + Dirty Fields -> UPDATE users SET name='Alice Wonder' WHERE id=1
await user.save()

🏗️ Web Framework Integration

Opyradesigned for dependency injection.

# app.py
op = Operation(os.getenv("DATABASE_URL"))
op.register(User)
op.register(Post)

# Inject into your app
app.keep('op', op)

# handling request
async def get_user(req, res, ctx):
    op = ctx.peek('op')
    user = await op.user.find(int(req.params['id']))
    res.body = user

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opyra-0.0.5.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opyra-0.0.5-py3-none-any.whl (17.6 kB view details)

Uploaded Python 3

File details

Details for the file opyra-0.0.5.tar.gz.

File metadata

  • Download URL: opyra-0.0.5.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/6.14.0-37-generic

File hashes

Hashes for opyra-0.0.5.tar.gz
Algorithm Hash digest
SHA256 ffb028ecb68216b0140fa7869fd1b14f03957cb126248eb626761b3b34d6fba3
MD5 20687f911b5bbbd7615fa3a1d1f1acbe
BLAKE2b-256 ffde020957c94fa41d9d805ae325a464b776e2d622b31d4d4da4531ca547717f

See more details on using hashes here.

File details

Details for the file opyra-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: opyra-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 17.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/6.14.0-37-generic

File hashes

Hashes for opyra-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 1fccbaaa01fce0d7b564aa34de196eb87b94351598cd5d61ea71df2600fa970c
MD5 08fb3aa8da5cfe284749f2b632d7a158
BLAKE2b-256 4dc03c6cd3b1c68afbc07dfc7333d98baf88aadde23b1c564b20b5f049bcdd62

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page