A simple Pydantic ORM implementation for SurrealDB
Project description
Surrantic
A simple and intuitive Pydantic-based ORM for SurrealDB, providing both synchronous and asynchronous operations.
Features
- 🔄 Both synchronous and asynchronous operations
- 🏗️ Built on top of Pydantic for robust data validation
- 🚀 Simple and intuitive API
- 📝 Type hints and comprehensive documentation
- 🔍 Automatic timestamp handling for created/updated fields
- 🎯 Support for complex queries and relationships
Installation
pip install surrantic
Quick Start
from datetime import datetime
from typing import Optional
from surrantic import ObjectModel
from surrealdb import RecordID
class User(ObjectModel):
table_name = "user" # Define the table name in SurrealDB
name: str
email: str
age: Optional[int] = None
# Async Usage
async def main():
# Create a new user
user = User(name="John Doe", email="john@example.com", age=30)
await user.asave() # Saves to SurrealDB
print(f"User created with ID: {user.id}")
# Fetch all users
all_users = await User.aget_all()
for user in all_users:
print(f"Found user: {user.name}")
# Get a specific user
user_id = "user:123" # or RecordID object
user = await User.aget(user_id)
if user:
print(f"Found user: {user.name}")
# Delete a user
await user.adelete()
# Synchronous Usage
def sync_example():
user = User(name="Jane Doe", email="jane@example.com")
user.save() # Synchronous save
# Get all users
users = User.get_all()
# Delete user
user.delete()
Advanced Usage
Custom Queries and Ordering
# Get all users ordered by name
users = await User.aget_all(order_by="name", order_direction="ASC")
Timestamps
Created and updated timestamps are automatically handled:
user = User(name="John", email="john@example.com")
await user.asave()
print(f"Created at: {user.created}") # Automatically set
print(f"Updated at: {user.updated}") # Automatically set
RecordID Serialization
When using RecordID fields in your models, you should add a field serializer to properly convert them to strings when using model_dump(). Here's an example:
from pydantic import field_serializer
from surrealdb import RecordID
class User(ObjectModel):
table_name = "user"
name: str
class Post(ObjectModel):
table_name = "post"
title: str
author: RecordID # Reference to a User
@field_serializer('author')
def serialize_author(self, author: RecordID) -> str:
return str(author)
Note: The base ObjectModel already handles the serialization of the id field.
Configuration
Database Connection
By default, Surrantic uses environment variables for database configuration:
SURREAL_ADDRESS=ws://localhost:8000
SURREAL_USER=root
SURREAL_PASS=root
SURREAL_NAMESPACE=test
SURREAL_DATABASE=test
You can also override these settings directly in your code using SurranticConfig:
from surrantic import SurranticConfig
SurranticConfig.configure(
address="ws://localhost:8000",
user="root",
password="root",
namespace="test",
database="test",
debug=True # Enable query logging
)
When debug mode is enabled, all queries and their results will be logged:
DEBUG:surrantic.base:Query: SELECT * FROM user ORDER BY created DESC
DEBUG:surrantic.base:Result: [{"id": "user:123", "name": "John Doe", "email": "john@example.com"}]
Logging
Surrantic includes configurable logging:
from surrantic.logging_config import setup_logging
import logging
# Console only logging
setup_logging(level=logging.DEBUG)
# Console and file logging
setup_logging(level=logging.INFO, log_file="surrantic.log")
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Requirements
- Python 3.11+
- pydantic >= 2.0.0
- surrealdb >= 0.3.0
Acknowledgments
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 surrantic-0.1.5.tar.gz.
File metadata
- Download URL: surrantic-0.1.5.tar.gz
- Upload date:
- Size: 65.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ab91ed05180d2e3a30c40f540d5be1bdb470fc800b83198e87ffb1ff2fa6ae2
|
|
| MD5 |
dbd2ba7d50aa133620744c6cb5c1f55b
|
|
| BLAKE2b-256 |
8a115e2a5b907221d336c56d69faa4b7bc076d18505d88f5cffd6e81c7f136a2
|
File details
Details for the file surrantic-0.1.5-py3-none-any.whl.
File metadata
- Download URL: surrantic-0.1.5-py3-none-any.whl
- Upload date:
- Size: 7.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
025457702a78d9dac32d39d2c87a231ef6a657ac7dfb6b44d363217e9c87aae7
|
|
| MD5 |
a6ef60964109968a39888b54ede7a1a3
|
|
| BLAKE2b-256 |
8af325c478b0e95d0a8279a1b112d51940f7f2d0caa34981d79fb5e2e9f92733
|