A modern, Pythonic ORM for TypeDB with an Attribute-based API
Project description
TypeBridge
A modern, Pythonic ORM for TypeDB with an Attribute-based API that aligns with TypeDB's type system.
Features
- True TypeDB Semantics: Attributes are independent types that entities and relations own
- Flag System: Clean API for
@key,@unique, and@cardannotations - Flexible Cardinality: Express any cardinality constraint with
Card(min, max) - Pydantic Integration: Built on Pydantic v2 for automatic validation, serialization, and type safety
- Type-Safe: Full Python type hints and IDE autocomplete support
- Declarative Models: Define entities and relations using Python classes
- Automatic Schema Generation: Generate TypeQL schemas from your Python models
- Data Validation: Automatic type checking and coercion via Pydantic
- JSON Support: Seamless JSON serialization/deserialization
- CRUD Operations: Simple managers for entity and relation operations
- Query Builder: Pythonic interface for building TypeQL queries
Installation
# Clone the repository
git clone https://github.com/yourusername/type_bridge.git
cd type_bridge
# Install with uv
uv sync
# Or with pip
pip install -e .
Quick Start
1. Define Attribute Types
from type_bridge import String, Integer
class Name(String):
pass
class Age(Integer):
pass
2. Define Entities
from type_bridge import Entity, EntityFlags, Flag, Key, Card
class Person(Entity):
flags = EntityFlags(type_name="person") # Optional, defaults to lowercase class name
# Use Flag() for key/unique markers and Card for cardinality
name: Name = Flag(Key) # @key (implies @card(1..1))
age: Age | None # @card(0..1) - optional field
email: Email # @card(1..1) - default cardinality
tags: list[Tag] = Flag(Card(min=2)) # @card(2..) - two or more
3. Create Instances
# Create entity instances with attribute values
alice = Person(
name=Name("Alice"),
age=Age(30),
email=Email("alice@example.com")
)
# Pydantic handles validation and type coercion automatically
print(alice.name.value) # "Alice"
4. Work with Data
from type_bridge import Database, SchemaManager
# Connect to database
db = Database(address="localhost:1729", database="mydb")
db.connect()
db.create_database()
# Define schema
schema_manager = SchemaManager(db)
schema_manager.register(Person, Company, Employment)
schema_manager.sync_schema()
# Insert entities - use typed instances
alice = Person(
name=Name("Alice"),
age=Age(30),
email=Email("alice@example.com")
)
Person.manager(db).insert(alice)
# Insert relations - use typed instances
employment = Employment(
employee=alice,
employer=techcorp,
position=Position("Engineer"),
salary=Salary(100000)
)
Employment.manager(db).insert(employment)
5. Cardinality Constraints
from type_bridge import Card, Flag
class Person(Entity):
flags = EntityFlags(type_name="person")
# Cardinality options:
name: Name # @card(1..1) - exactly one (default)
age: Age | None # @card(0..1) - zero or one
tags: list[Tag] = Flag(Card(min=2)) # @card(2..) - two or more (unbounded)
skills: list[Skill] = Flag(Card(max=5)) # @card(0..5) - zero to five
jobs: list[Job] = Flag(Card(1, 3)) # @card(1..3) - one to three
6. Define Relations
from type_bridge import Relation, RelationFlags, Role
class Employment(Relation):
flags = RelationFlags(type_name="employment")
# Define roles with type-safe Role[T] syntax
employee: Role[Person] = Role("employee", Person)
employer: Role[Company] = Role("employer", Company)
# Relations can own attributes
position: Position # @card(1..1)
salary: Salary | None # @card(0..1)
7. Using Python Inheritance
class Animal(Entity):
flags = EntityFlags(abstract=True) # Abstract entity
name: Name
class Dog(Animal): # Automatically: dog sub animal in TypeDB
breed: Breed
Documentation
See ATTRIBUTE_API.md for complete documentation.
Pydantic Integration
TypeBridge is built on Pydantic v2, giving you powerful features:
class Person(Entity):
flags = EntityFlags(type_name="person")
name: Name = Flag(Key)
age: Age
# Automatic validation and type coercion
alice = Person(name=Name("Alice"), age=Age(30))
# JSON serialization
json_data = alice.model_dump_json()
# JSON deserialization
bob = Person.model_validate_json('{"name": "Bob", "age": 25}')
# Model copying
alice_copy = alice.model_copy(update={"age": Age(31)})
Running Examples
uv run python examples/basic/crud.py
Running Tests
uv run pytest tests/ -v
Requirements
- Python 3.13+
- TypeDB 3.x
- typedb-driver==3.5.5
License
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
type_bridge-0.2.4.tar.gz
(96.8 kB
view details)
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 type_bridge-0.2.4.tar.gz.
File metadata
- Download URL: type_bridge-0.2.4.tar.gz
- Upload date:
- Size: 96.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d8c8348f91835b8afc63e9a54aad35ae7864884587f6e25d75b51ce957faf61
|
|
| MD5 |
b515315e02f95944d6517a7444f88ee6
|
|
| BLAKE2b-256 |
6420331a398e0de4345b2839017c680f56b91dfcd762e002522e4c7d091da0cd
|
File details
Details for the file type_bridge-0.2.4-py3-none-any.whl.
File metadata
- Download URL: type_bridge-0.2.4-py3-none-any.whl
- Upload date:
- Size: 49.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c693aaf62318aad15c60cf5bb725b372723f85a9451faa139de66576ec14c561
|
|
| MD5 |
ff67b956eb5e04c76b1e7a03c0755568
|
|
| BLAKE2b-256 |
78f54721c6ffaae0f6ffa4b4b9d2357d57b897dcb3a078e9292cd54dff3a128e
|