A modern, Pythonic ORM for TypeDB with an Attribute-based API that aligns with TypeDB's type system.
- True TypeDB Semantics: Attributes are independent types that entities and relations own
- Complete Type Support: All TypeDB value types - String, Integer, Double, Decimal, Boolean, Date, DateTime, DateTimeTZ, Duration
- 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
- Schema Conflict Detection: Automatic detection of breaking schema changes to prevent data loss
- Data Validation: Automatic type checking and coercion via Pydantic, including keyword validation
- JSON Support: Seamless JSON serialization/deserialization
- CRUD Operations: Full CRUD with fetching API (get, filter, all, update) for entities and relations
- Chainable Operations: Filter, delete, and bulk update with method chaining and lambda functions
- Query Builder: Pythonic interface for building TypeQL queries
# Clone the repository
git clone https://github.com/ds1sqe/type-bridge.git
cd type_bridge
# Install with uv
uv sync
# Or with pip
pip install -e .
# Or add to project with uv
uv add type-bridgeTypeBridge supports all TypeDB value types:
from type_bridge import String, Integer, Double, Decimal, Boolean, Date, DateTime, DateTimeTZ, Duration
class Name(String):
pass
class Age(Integer):
pass
class Balance(Decimal): # High-precision fixed-point numbers
pass
class BirthDate(Date): # Date-only values
pass
class UpdatedAt(DateTimeTZ): # Timezone-aware datetime
passConfiguring Attribute Type Names:
from type_bridge import AttributeFlags, TypeNameCase
# Option 1: Explicit name override
class Name(String):
flags = AttributeFlags(name="person_name")
# TypeDB: attribute person_name, value string;
# Option 2: Case formatting
class UserEmail(String):
flags = AttributeFlags(case=TypeNameCase.SNAKE_CASE)
# TypeDB: attribute user_email, value string;from type_bridge import Entity, TypeFlags, Flag, Key, Card
class Person(Entity):
flags = TypeFlags(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 = None # @card(0..1) - optional field (explicit default)
email: Email # @card(1..1) - default cardinality
tags: list[Tag] = Flag(Card(min=2)) # @card(2..) - two or more (unordered set)Note:
list[Type]represents an unordered set in TypeDB. TypeDB has no list type - order is never preserved.
# Create entity instances with attribute values (keyword arguments required)
alice = Person(
name=Name("Alice"),
age=Age(30),
email=Email("[email protected]")
)
# Pydantic handles validation and type coercion automatically
print(alice.name.value) # "Alice"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("[email protected]")
)
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)from type_bridge import Card, Flag
class Person(Entity):
flags = TypeFlags(name="person")
# Cardinality options:
name: Name # @card(1..1) - exactly one (default)
age: Age | None = None # @card(0..1) - zero or one (explicit default)
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 threefrom type_bridge import Relation, TypeFlags, Role
class Employment(Relation):
flags = TypeFlags(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 = None # @card(0..1) - explicit defaultclass Animal(Entity):
flags = TypeFlags(abstract=True) # Abstract entity
name: Name
class Dog(Animal): # Automatically: dog sub animal in TypeDB
breed: Breed- CLAUDE.md - Project guidance for development, TypeDB concepts, and quick reference
- docs/DEVELOPMENT.md - Development setup, commands, and code quality standards
- docs/TESTING.md - Testing strategy, patterns, and execution
- docs/TYPEDB.md - TypeDB concepts, driver API, and TypeQL syntax
- docs/ABSTRACT_TYPES.md - Abstract types and interface hierarchies in TypeDB
- docs/INTERNALS.md - Internal type system and architecture
- docs/api/README.md - API overview and quick reference
- docs/api/attributes.md - Attribute types and value types
- docs/api/entities.md - Entity definition and ownership
- docs/api/relations.md - Relations, roles, and role players
- docs/api/abstract_types.md - Abstract types implementation and patterns
- docs/api/cardinality.md - Card API and Flag system
- docs/api/crud.md - CRUD operations and managers
- docs/api/queries.md - Query expressions and aggregations
- docs/api/schema.md - Schema management and conflict detection
- docs/api/validation.md - Pydantic integration and type safety
TypeBridge is built on Pydantic v2, giving you powerful features:
class Person(Entity):
flags = TypeFlags(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)})TypeBridge includes comprehensive examples organized by complexity:
# Basic CRUD examples (start here!)
uv run python examples/basic/crud_01_define.py # Schema definition
uv run python examples/basic/crud_02_insert.py # Data insertion
uv run python examples/basic/crud_03_read.py # Fetching API
uv run python examples/basic/crud_04_update.py # Update operations
# Advanced examples
uv run python examples/advanced/schema_01_manager.py # Schema operations
uv run python examples/advanced/schema_02_comparison.py # Schema comparison
uv run python examples/advanced/schema_03_conflict.py # Conflict detection
uv run python examples/advanced/pydantic_features.py # Pydantic integration
uv run python examples/advanced/type_safety.py # Literal types
uv run python examples/advanced/reserved_words_validation.py # Keyword validationTypeBridge uses a two-tier testing approach with 100% test pass rate:
# Unit tests (fast, no external dependencies) - DEFAULT
uv run pytest # Run 304 unit tests (0.3s)
uv run pytest tests/unit/attributes/ -v # Test all 9 attribute types
uv run pytest tests/unit/core/ -v # Test core functionality
uv run pytest tests/unit/flags/ -v # Test flag system
uv run pytest tests/unit/expressions/ -v # Test query expressions
# Integration tests (requires running TypeDB server)
# Option 1: Use Docker (recommended)
./test-integration.sh # Starts Docker, runs tests, stops Docker
# Option 2: Use existing TypeDB server
USE_DOCKER=false uv run pytest -m integration -v # Run 147 integration tests (~18s)
# Run specific integration test categories
uv run pytest tests/integration/crud/entities/ -v # Entity CRUD tests
uv run pytest tests/integration/crud/relations/ -v # Relation CRUD tests
uv run pytest tests/integration/queries/ -v # Query expression tests
uv run pytest tests/integration/schema/ -v # Schema operation tests
# All tests
uv run pytest -m "" -v # Run all tests
./test.sh # Run full test suite with detailed output
./check.sh # Run linting and type checking- Python 3.13+
- TypeDB 3.x server (fully compatible)
- typedb-driver==3.5.5
- pydantic>=2.0.0
- isodate==0.7.2 (for Duration type support)
See the CHANGELOG.md for detailed release notes and version history.
MIT License