Skip to main content

Database client for Mysql, MongoDB and Sqlite

Project description

ODBMS - Object Document/Relational Mapping System

A flexible and modern Python ORM supporting multiple databases (MongoDB, PostgreSQL, MySQL) with both synchronous and asynchronous operations.

Features

  • Support for multiple databases:
    • SQLite (using sqlite3)
    • MongoDB (using Motor)
    • PostgreSQL (using aiopg)
    • MySQL (using aiomysql)
  • Both synchronous and asynchronous operations
  • Connection pooling for better performance
  • Type-safe field definitions
  • Pydantic integration for validation
  • Automatic table/collection creation
  • Relationship handling
  • Computed fields
  • Flexible query interface

Installation

pip install -r requirements.txt

Quick Start

from odbms import Model, StringField, IntegerField, EmailField
from odbms.dbms import DBMS

# Initialize database connection
DBMS.initialize(
    dbms='postgresql',  # or 'mongodb', 'mysql'
    host='localhost',
    port=5432,
    database='mydb',
    username='user',
    password='pass'
)

# Define your model
class User(Model):
    name: str = StringField()
    email: str = EmailField()
    age: int = IntegerField(min_value=0)

# Create a new user
user = User(name='John Doe', email='john@example.com', age=30)
await user.save_async()  # or user.save() for sync operation

# Find users
users = await User.find_async({'age': {'$gte': 25}})  # or User.find() for sync

Field Types

  • StringField: For text data
  • IntegerField: For integer values
  • FloatField: For floating-point numbers
  • BooleanField: For true/false values
  • DateTimeField: For timestamps
  • EmailField: For email addresses with validation
  • IDField: For primary keys/IDs
  • ComputedField: For dynamically computed values
  • ListField: For arrays/lists
  • DictField: For nested documents/objects

Database Operations

Synchronous Operations

# Create
user = User(name='John', email='john@example.com')
user.save()

# Read
user = User.find_one({'email': 'john@example.com'})
users = User.find({'age': {'$gte': 25}})
all_users = User.all()

# Update
User.update({'age': {'$lt': 18}}, {'is_minor': True})

# Delete
User.remove({'status': 'inactive'})

# Aggregation
total_age = User.sum('age', {'country': 'US'})

Asynchronous Operations

# Create
user = User(name='Jane', email='jane@example.com')
await user.save_async()

# Read
user = await User.find_one_async({'email': 'jane@example.com'})
users = await User.find_async({'age': {'$gte': 25}})
all_users = await User.all_async()

# Update
await User.update_async({'age': {'$lt': 18}}, {'is_minor': True})

# Delete
await User.remove_async({'status': 'inactive'})

# Aggregation
total_age = await User.sum_async('age', {'country': 'US'})

Relationships

class Post(Model):
    title: str = StringField()
    content: str = StringField()
    author_id: str = IDField()

class User(Model):
    name: str = StringField()
    posts: List[Post] = ListField(model=Post)

# Create related records
user = User(name='John')
await user.save_async()

post = Post(title='Hello', content='World', author_id=user.id)
await post.save_async()

# Access relationships
user_posts = await user.posts  # Automatically fetches related posts

Testing

Run the test suite:

pytest tests/

The test suite includes comprehensive tests for:

  • All database operations (CRUD)
  • Both sync and async operations
  • Field validations
  • Relationships
  • Computed fields
  • Aggregations

Requirements

  • Python 3.7+
  • pydantic >= 2.0.0
  • motor >= 3.3.0 (for MongoDB)
  • aiopg >= 1.4.0 (for PostgreSQL)
  • aiomysql >= 0.2.0 (for MySQL)
  • inflect >= 5.0.0
  • python-dotenv >= 0.19.0

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Commit your changes
  4. Push to the branch
  5. Create a Pull Request

License

MIT License

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

odbms-0.5.2.tar.gz (52.3 kB view details)

Uploaded Source

Built Distribution

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

odbms-0.5.2-py3-none-any.whl (50.6 kB view details)

Uploaded Python 3

File details

Details for the file odbms-0.5.2.tar.gz.

File metadata

  • Download URL: odbms-0.5.2.tar.gz
  • Upload date:
  • Size: 52.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for odbms-0.5.2.tar.gz
Algorithm Hash digest
SHA256 728e34ca15af777a114b607c9a7b364a104315c0750c02bfe3c3060b812477bf
MD5 39fa2e932f73c32661d939939cb6bd24
BLAKE2b-256 659f901869d793fc4da80995b9d269762daac7281b361d0e51c3dabb13136625

See more details on using hashes here.

File details

Details for the file odbms-0.5.2-py3-none-any.whl.

File metadata

  • Download URL: odbms-0.5.2-py3-none-any.whl
  • Upload date:
  • Size: 50.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for odbms-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 3318e2e722067e51bee9fc463ee7201d5a1a38bb928831f3da181bcd4d73ce8c
MD5 8611532308322daf2dadaa6b4e41de1d
BLAKE2b-256 d5d6f2edbc3da8922d6d783ce1604901837809a65c8f7a0322a2c019f8f87341

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