This document tracks the migration from SQLx to SeaORM, following b00t gospel: "use existing crates, don't write your own database interface".
SeaORM Dependencies:
- Added
sea-orm 1.1with full feature set (sqlx-postgres, runtime-tokio-rustls, macros, type support) - Added
sea-orm-migration 1.1for schema management - Marked SQLx as legacy (being phased out)
Migration System:
- Created
migration/crate with 22 table migrations covering core schema - Built
postgres_to_seaorm.pytool for automated migration generation- Parses PostgreSQL
CREATE TABLEstatements - Generates SeaORM migration files with up/down methods
- Handles all PostgreSQL types (integers, strings, timestamps, decimals, JSONB, UUIDs)
- Auto-generates migration registry
- Parses PostgreSQL
Entities Generated:
entity/crate with core entity definitions:customers(9 fields): Customer data with Argon2 password hashingproducts(14 fields): Product catalog with Decimal pricingorders(10 fields): Order lifecycle tracking
Created modern SeaORM-based service layers (not yet integrated):
Customer Service (crates/customer/src/lib_seaorm.rs):
- Full CRUD operations using SeaORM query builder
- Password hashing with Argon2id
- Methods:
create,find_by_id,find_by_email,update,delete,verify_password,set_password
Product Service (crates/product/src/lib_seaorm.rs):
- Product catalog management with pagination
- Price update tracking
- Methods:
create,find_by_id,find_by_product_id,list,update,delete,update_price,mark_sold
Order Service (crates/order/src/lib_seaorm.rs):
- Order lifecycle management
- Customer and pool filtering
- Methods:
create,find_by_id,find_by_orderid,find_by_cartid,list_by_customer,list_by_pool,update,mark_paid,mark_shipped,delete
The new SeaORM services exist in parallel with the old SQLx code:
- Old:
lib.rs(uses SQLx query! macros - requires DATABASE_URL at compile time) - New:
lib_seaorm.rs(uses SeaORM - compiles without database)
Old code still being built, causing compilation failures without DATABASE_URL.
Replace SQLx-based lib.rs files with SeaORM versions:
# For each crate (customer, product, order):
cd crates/customer
mv lib.rs lib_sqlx.rs.bak
mv lib_seaorm.rs lib.rs
# Update Cargo.toml to remove sqlx dependency
# Rebuild and verifyRefactor crates/api/src/routes/*.rs to use new service layers:
- Replace
PgPoolwithDatabaseConnection - Use service methods instead of direct SQL queries
- Update route handlers
Create justfile commands for SeaORM workflow:
# Run migrations
migrate-up:
cd commercerack-rust
cargo run --package migration -- up
# Rollback migrations
migrate-down:
cd commercerack-rust
cargo run --package migration -- down
# Generate entities from database
generate-entities:
cd commercerack-rust
sea-orm-cli generate entity \
--database-url "$DATABASE_URL" \
--output-dir entity/src \
--with-serde bothOnce database is available:
- Run migrations:
just migrate-up - Generate fresh entities:
just generate-entities - Run integration tests
- Verify all 11 tests pass (previous count)
After successful migration:
- Remove SQLx dependency from all crates
- Delete
lib_sqlx.rs.bakbackup files - Delete old SQL migration files in
migrations/ - Update documentation
22 Core Tables Migrated:
- zusers (36 columns) - User accounts
- customers (27 columns) - Customer records
- customer_addrs (13 columns) - Customer addresses
- customer_notes (6 columns) - Customer notes
- products (22 columns) - Product catalog
- product_relations (7 columns) - Product relationships
- sku_lookup (38 columns) - SKU data
- orders (35 columns) - Order records
- order_events (8 columns) - Order event log
- order_counters (5 columns) - Order ID generation
- inventory_detail (37 columns) - Inventory tracking
- inventory_log (10 columns) - Inventory history
- amazon_docs (11 columns) - Amazon document tracking
- amazon_document_contents (7 columns) - Amazon doc content
- amazon_orders (17 columns) - Amazon order sync
- amazon_order_events (9 columns) - Amazon event log
- batch_jobs (29 columns) - Batch processing
- batch_parameters (10 columns) - Batch config
- campaigns (20 columns) - Email campaigns
- campaign_recipients (15 columns) - Campaign targets
- projects (16 columns) - Virtual store projects
- checkouts (8 columns) - Checkout assist tracking
Remaining: 127 tables to be migrated in subsequent phases
Compile-Time Safety:
- SeaORM entities provide compile-time type checking
- No need for DATABASE_URL during compilation
- Catch schema mismatches at build time
Developer Experience:
- Modern async/await API
- Active Record pattern for simple operations
- Query builder for complex queries
- Automatic connection pooling
Production Ready:
- Battle-tested ORM used by major Rust projects
- Excellent documentation and community support
- Supports PostgreSQL, MySQL, SQLite
Following b00t gospel, we chose SeaORM over:
- ❌ Raw SQL (error-prone, no type safety)
- ❌ SQLx (compile-time checks require live DB)
- ❌ Custom database layer (reinventing the wheel)
- ✅ SeaORM (battle-tested, compile-time safe, async-first)