A small library to simplify SQLAlchemy usage with FastAPI
Project description
repository_sqlalchemy
repository_sqlalchemy is a small library that simplifies SQLAlchemy usage with automatic transaction and session management. It provides a base repository pattern implementation, similar to JPA in the Java world.
Features
- Base repository pattern for common database operations
- Automatic session management using context variables
- Transaction management with a convenient decorator
- Support for nested transactions and savepoints
- No need for manual session commits or rollbacks
Installation
You can install repository_sqlalchemy using pip:
pip install repository_sqlalchemy
Usage
Environment Setup
Before using the library, set up the following environment variables:
export DB_TYPE=postgresql # or mysql, sqlite
export DB_USER=your_username
export DB_PASSWORD=your_password
export DB_HOST=your_host
export DB_PORT=your_port
export DB_NAME=your_database_name
Example Usage
Here's a comprehensive example demonstrating how to use the repository_sqlalchemy library:
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from repository_sqlalchemy import BaseRepository, Base, transaction
from typing import List, Dict, Any
class UserModel(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(50), unique=True, nullable=False)
email = Column(String(120), unique=True, nullable=False)
class PostModel(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String(100), nullable=False)
content = Column(String(1000), nullable=False)
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
class UserRepository(BaseRepository[UserModel]):
def find_by_username(self, username: str) -> UserModel:
return self.session.query(self.model).filter_by(username=username).first()
class PostRepository(BaseRepository[PostModel]):
def find_by_user_id(self, user_id: int) -> List[PostModel]:
return self.session.query(self.model).filter_by(user_id=user_id).all()
@transaction()
def create_user_with_posts(username: str, email: str, posts: List[Dict[str, str]]) -> UserModel:
user_repo = UserRepository()
post_repo = PostRepository()
# Create user
user = user_repo.create(UserModel(username=username, email=email))
# Create posts for the user
for post_data in posts:
post = PostModel(title=post_data['title'], content=post_data['content'], user_id=user.id)
post_repo.create(post)
return user
@transaction()
def update_user_and_posts(username: str, user_data: Dict[str, Any], post_updates: List[Dict[str, Any]]) -> UserModel:
user_repo = UserRepository()
post_repo = PostRepository()
user = user_repo.find_by_username(username)
if not user:
raise ValueError(f"User {username} not found")
# Update user
user_repo.update(user, user_data)
# Update posts
posts = post_repo.find_by_user_id(user.id)
for post, post_data in zip(posts, post_updates):
post_repo.update(post, post_data)
return user
# Usage
new_user = create_user_with_posts(
"john_doe",
"john@example.com",
[
{"title": "First Post", "content": "Hello, world!"},
{"title": "Second Post", "content": "This is my second post."}
]
)
print(f"Created user: {new_user.username} with 2 posts")
updated_user = update_user_and_posts(
"john_doe",
{"email": "john.doe@newdomain.com"},
[
{"title": "Updated First Post"},
{"content": "Updated content for second post."}
]
)
print(f"Updated user: {updated_user.username}, {updated_user.email}")
This example demonstrates:
- Defining SQLAlchemy models (
UserModelandPostModel). - Creating custom repositories (
UserRepositoryandPostRepository) with additional methods. - Using the
@transaction()decorator for automatic transaction management across multiple operations. - Performing create and update operations on multiple entities within a single transaction.
- Automatic session handling within repository methods, with no need for manual commits or rollbacks.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file repository_sqlalchemy-0.1.4.tar.gz.
File metadata
- Download URL: repository_sqlalchemy-0.1.4.tar.gz
- Upload date:
- Size: 7.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.9.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9463cacae4cd7832024d6a232b6c492e0801bfd2cff5269bd4588b7fcc05d67f
|
|
| MD5 |
d9bc3b5df628da5f61455a482485c78a
|
|
| BLAKE2b-256 |
9abd48df18f20a40e04a947ab821525c912509a01b6e845ac8736de25b429922
|
File details
Details for the file repository_sqlalchemy-0.1.4-py3-none-any.whl.
File metadata
- Download URL: repository_sqlalchemy-0.1.4-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.9.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b6cba3927b2440fa580afecb93685819d0def0446515f12e5a8ff9126241bd8
|
|
| MD5 |
047b32368904ec8a47790a630a5ce98f
|
|
| BLAKE2b-256 |
05d3351f925d6539c7385b0cfee2a454510e76db7e9237a0bd4232d3c216a332
|