689 lines
14 KiB
Markdown
689 lines
14 KiB
Markdown
|
|
# SurrealDB 2.3 Quick Start Guide
|
||
|
|
|
||
|
|
**Status**: Production Ready ✅
|
||
|
|
**Version**: SurrealDB 2.3
|
||
|
|
**Updated**: November 15, 2025
|
||
|
|
|
||
|
|
This guide shows how to quickly get started with SurrealDB 2.3 in syntaxis with different deployment contexts.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Quick Install & Run
|
||
|
|
|
||
|
|
### Option 1: Embedded In-Memory (Fastest, No Server)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# No installation needed - uses embedded library
|
||
|
|
# Update configs/database.toml:
|
||
|
|
|
||
|
|
[surrealdb]
|
||
|
|
url = "mem://" # In-memory database
|
||
|
|
namespace = "syntaxis"
|
||
|
|
database = "projects"
|
||
|
|
```
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::SurrealDatabase;
|
||
|
|
|
||
|
|
#[tokio::main]
|
||
|
|
async fn main() -> Result<()> {
|
||
|
|
// Create in-memory database
|
||
|
|
let db = SurrealDatabase::new_memory().await?;
|
||
|
|
|
||
|
|
// Start using database immediately
|
||
|
|
let projects = db.list_projects().await?;
|
||
|
|
println!("Projects: {}", projects.len());
|
||
|
|
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Option 2: Embedded File-Based (Persistent, No Server)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Update configs/database.toml:
|
||
|
|
|
||
|
|
[surrealdb]
|
||
|
|
url = "file:///tmp/surrealdb.db" # RocksDB persistent storage
|
||
|
|
namespace = "syntaxis"
|
||
|
|
database = "projects"
|
||
|
|
```
|
||
|
|
|
||
|
|
```rust
|
||
|
|
let db = SurrealDatabase::new_file("/tmp/surrealdb.db").await?;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Option 3: Server Mode (Full Features, Requires Setup)
|
||
|
|
|
||
|
|
#### Install SurrealDB
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# macOS
|
||
|
|
brew install surrealdb
|
||
|
|
|
||
|
|
# Linux/WSL
|
||
|
|
cargo install surreal
|
||
|
|
|
||
|
|
# Windows
|
||
|
|
choco install surrealdb
|
||
|
|
|
||
|
|
# Verify
|
||
|
|
surreal version
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Start Server
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Simple in-memory server
|
||
|
|
surreal start --bind 127.0.0.1:8000 memory
|
||
|
|
|
||
|
|
# File-based with persistence
|
||
|
|
surreal start --bind 127.0.0.1:8000 file:///tmp/surrealdb.db
|
||
|
|
|
||
|
|
# With authentication
|
||
|
|
surreal start \
|
||
|
|
--bind 127.0.0.1:8000 \
|
||
|
|
--username admin \
|
||
|
|
--password your_password \
|
||
|
|
file:///tmp/surrealdb.db
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Connect from Application
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Update configs/database.toml:
|
||
|
|
// [surrealdb]
|
||
|
|
// url = "ws://localhost:8000"
|
||
|
|
// username = "admin"
|
||
|
|
// password = "your_password"
|
||
|
|
|
||
|
|
use workspace_core::SurrealDatabase;
|
||
|
|
|
||
|
|
#[tokio::main]
|
||
|
|
async fn main() -> Result<()> {
|
||
|
|
let db = SurrealDatabase::new_server(
|
||
|
|
"ws://localhost:8000",
|
||
|
|
"syntaxis",
|
||
|
|
"projects",
|
||
|
|
Some("admin"),
|
||
|
|
Some("your_password"),
|
||
|
|
).await?;
|
||
|
|
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Core Operations
|
||
|
|
|
||
|
|
### 1. Create a Project
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::{SurrealDatabase, DbProject};
|
||
|
|
use chrono::Utc;
|
||
|
|
use uuid::Uuid;
|
||
|
|
|
||
|
|
let db = SurrealDatabase::new_memory().await?;
|
||
|
|
|
||
|
|
let project = DbProject {
|
||
|
|
id: Uuid::new_v4().to_string(),
|
||
|
|
name: "My Project".to_string(),
|
||
|
|
version: "0.1.0".to_string(),
|
||
|
|
description: "A SurrealDB project".to_string(),
|
||
|
|
project_type: "MultiLang".to_string(),
|
||
|
|
current_phase: "Creation".to_string(),
|
||
|
|
created_at: Utc::now().to_rfc3339(),
|
||
|
|
updated_at: Utc::now().to_rfc3339(),
|
||
|
|
};
|
||
|
|
|
||
|
|
db.create_project(&project).await?;
|
||
|
|
println!("✓ Project created: {}", project.id);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Retrieve Projects
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Get all projects
|
||
|
|
let projects = db.list_projects().await?;
|
||
|
|
println!("Total projects: {}", projects.len());
|
||
|
|
|
||
|
|
// Get specific project
|
||
|
|
if let Some(project) = db.get_project(&project_id).await? {
|
||
|
|
println!("Project: {} (Phase: {})", project.name, project.current_phase);
|
||
|
|
} else {
|
||
|
|
println!("Project not found");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get projects by phase
|
||
|
|
for project in &projects {
|
||
|
|
if project.current_phase == "Development" {
|
||
|
|
println!(" - {} (in Development)", project.name);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Add Checklist Items
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::DbChecklistItem;
|
||
|
|
|
||
|
|
let item = DbChecklistItem {
|
||
|
|
id: Uuid::new_v4().to_string(),
|
||
|
|
project_id: project.id.clone(),
|
||
|
|
phase: "Creation".to_string(),
|
||
|
|
task_id: "setup-1".to_string(),
|
||
|
|
description: "Initialize project structure".to_string(),
|
||
|
|
completed: false,
|
||
|
|
completed_at: None,
|
||
|
|
created_at: Utc::now().to_rfc3339(),
|
||
|
|
task_type: "Setup".to_string(),
|
||
|
|
task_priority: "High".to_string(),
|
||
|
|
task_due: Some("2025-12-31".to_string()),
|
||
|
|
task_estimation: Some("2d".to_string()),
|
||
|
|
task_deps: "[]".to_string(), // Comma-separated IDs
|
||
|
|
task_note: Some("Remember to test thoroughly".to_string()),
|
||
|
|
task_name: Some("Setup".to_string()),
|
||
|
|
};
|
||
|
|
|
||
|
|
db.create_checklist_item(&item).await?;
|
||
|
|
println!("✓ Added checklist item");
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Track Progress
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Get checklist items for a phase
|
||
|
|
let items = db.get_checklist_items_by_phase(&project_id, "Creation").await?;
|
||
|
|
let completed = items.iter().filter(|i| i.completed).count();
|
||
|
|
|
||
|
|
println!("Progress: {}/{}", completed, items.len());
|
||
|
|
|
||
|
|
// Get completion percentage
|
||
|
|
let percentage = db.get_completion_percentage(&project_id, "Creation").await?;
|
||
|
|
println!("Phase completion: {:.1}%", percentage);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Record Phase Transition
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::DbPhaseTransition;
|
||
|
|
|
||
|
|
let transition = DbPhaseTransition {
|
||
|
|
id: Uuid::new_v4().to_string(),
|
||
|
|
project_id: project.id.clone(),
|
||
|
|
from_phase: "Creation".to_string(),
|
||
|
|
to_phase: "Development".to_string(),
|
||
|
|
timestamp: Utc::now().to_rfc3339(),
|
||
|
|
reason: Some("Initial setup complete".to_string()),
|
||
|
|
};
|
||
|
|
|
||
|
|
db.record_phase_transition(&transition).await?;
|
||
|
|
println!("✓ Phase transitioned: Creation → Development");
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. Security Assessment
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::DbSecurityAssessment;
|
||
|
|
|
||
|
|
let assessment = DbSecurityAssessment {
|
||
|
|
id: Uuid::new_v4().to_string(),
|
||
|
|
project_id: project.id.clone(),
|
||
|
|
profile: "OWASP".to_string(),
|
||
|
|
risk_level: "Medium".to_string(),
|
||
|
|
passed_rules: 45,
|
||
|
|
failed_rules: 5,
|
||
|
|
critical_issues: 0,
|
||
|
|
assessment_date: Utc::now().to_rfc3339(),
|
||
|
|
};
|
||
|
|
|
||
|
|
db.create_security_assessment(&assessment).await?;
|
||
|
|
println!("✓ Security assessment recorded");
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Deployment Modes
|
||
|
|
|
||
|
|
### Mode 1: Development (In-Memory)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Perfect for: Testing, CI/CD, development without server
|
||
|
|
|
||
|
|
# In Rust:
|
||
|
|
let db = SurrealDatabase::new_memory().await?;
|
||
|
|
|
||
|
|
# No setup needed!
|
||
|
|
```
|
||
|
|
|
||
|
|
**Pros**:
|
||
|
|
- No server setup
|
||
|
|
- Very fast
|
||
|
|
- Perfect for testing
|
||
|
|
|
||
|
|
**Cons**:
|
||
|
|
- Data lost on restart
|
||
|
|
- Single process only
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Mode 2: Local Development (File-Based)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# For local development with persistence
|
||
|
|
|
||
|
|
# Start server
|
||
|
|
surreal start --bind 127.0.0.1:8000 file://~/.local/share/surrealdb.db
|
||
|
|
|
||
|
|
# In configuration
|
||
|
|
[surrealdb]
|
||
|
|
url = "ws://localhost:8000"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Pros**:
|
||
|
|
- Persistent data
|
||
|
|
- Can run alongside multiple processes
|
||
|
|
- Full server features
|
||
|
|
|
||
|
|
**Cons**:
|
||
|
|
- Requires server running
|
||
|
|
- Single machine only
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Mode 3: Docker (Development/Testing)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Start with Docker Compose
|
||
|
|
docker-compose -f docker-compose.surrealdb.yml up -d
|
||
|
|
|
||
|
|
# Check if running
|
||
|
|
docker-compose logs surrealdb
|
||
|
|
|
||
|
|
# Configuration
|
||
|
|
[surrealdb]
|
||
|
|
url = "ws://surrealdb:8000" # Container hostname
|
||
|
|
username = "admin"
|
||
|
|
password = "workspace_password_123"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Pros**:
|
||
|
|
- Isolated environment
|
||
|
|
- Reproducible setup
|
||
|
|
- Matches production
|
||
|
|
|
||
|
|
**Cons**:
|
||
|
|
- Requires Docker
|
||
|
|
- Slightly more overhead
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Mode 4: Kubernetes (Production)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Deploy to Kubernetes cluster
|
||
|
|
cd k8s && ./deploy.sh
|
||
|
|
|
||
|
|
# Configuration
|
||
|
|
[surrealdb]
|
||
|
|
url = "ws://surrealdb.workspace:8000" # K8s service DNS
|
||
|
|
username = "admin"
|
||
|
|
password = "${SURREALDB_PASSWORD}" # From k8s secret
|
||
|
|
tls_enabled = true
|
||
|
|
```
|
||
|
|
|
||
|
|
**Pros**:
|
||
|
|
- Production-grade
|
||
|
|
- Scalable
|
||
|
|
- Managed infrastructure
|
||
|
|
|
||
|
|
**Cons**:
|
||
|
|
- Complex setup
|
||
|
|
- Requires K8s knowledge
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Configuration Examples
|
||
|
|
|
||
|
|
### Example 1: Local Development
|
||
|
|
|
||
|
|
**File**: `configs/database.toml`
|
||
|
|
```toml
|
||
|
|
[database]
|
||
|
|
engine = "surrealdb"
|
||
|
|
|
||
|
|
[surrealdb]
|
||
|
|
url = "mem://" # In-memory, no server needed
|
||
|
|
namespace = "syntaxis"
|
||
|
|
database = "projects"
|
||
|
|
max_connections = 5
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example 2: Docker Development
|
||
|
|
|
||
|
|
**File**: `configs/database.toml`
|
||
|
|
```toml
|
||
|
|
[database]
|
||
|
|
engine = "surrealdb"
|
||
|
|
|
||
|
|
[surrealdb]
|
||
|
|
url = "ws://surrealdb:8000"
|
||
|
|
username = "admin"
|
||
|
|
password = "dev_password"
|
||
|
|
namespace = "syntaxis"
|
||
|
|
database = "projects"
|
||
|
|
max_connections = 10
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example 3: Production (Kubernetes)
|
||
|
|
|
||
|
|
**File**: `configs/database.toml`
|
||
|
|
```toml
|
||
|
|
[database]
|
||
|
|
engine = "surrealdb"
|
||
|
|
|
||
|
|
[surrealdb]
|
||
|
|
url = "ws://surrealdb.workspace:8000"
|
||
|
|
username = "admin"
|
||
|
|
password = "${SURREALDB_PASSWORD}" # Environment variable
|
||
|
|
namespace = "syntaxis"
|
||
|
|
database = "projects"
|
||
|
|
max_connections = 20
|
||
|
|
timeout_secs = 60
|
||
|
|
tls_enabled = true
|
||
|
|
tls_ca_cert = "/etc/surrealdb/ca.pem"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing with SurrealDB
|
||
|
|
|
||
|
|
### In-Memory Tests
|
||
|
|
|
||
|
|
```rust
|
||
|
|
#[tokio::test]
|
||
|
|
async fn test_project_lifecycle() {
|
||
|
|
// No setup needed - in-memory database
|
||
|
|
let db = SurrealDatabase::new_memory().await.unwrap();
|
||
|
|
|
||
|
|
// Create project
|
||
|
|
let project = DbProject {
|
||
|
|
id: "test-1".to_string(),
|
||
|
|
name: "Test Project".to_string(),
|
||
|
|
// ... other fields ...
|
||
|
|
};
|
||
|
|
|
||
|
|
let created = db.create_project(&project).await.unwrap();
|
||
|
|
assert_eq!(created.name, "Test Project");
|
||
|
|
|
||
|
|
// Verify retrieval
|
||
|
|
let retrieved = db.get_project("test-1").await.unwrap();
|
||
|
|
assert!(retrieved.is_some());
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Server-Mode Tests
|
||
|
|
|
||
|
|
```rust
|
||
|
|
#[tokio::test]
|
||
|
|
async fn test_with_server() {
|
||
|
|
// Requires: surreal start --bind 127.0.0.1:8000 memory
|
||
|
|
let db = SurrealDatabase::new_server(
|
||
|
|
"ws://localhost:8000",
|
||
|
|
"syntaxis",
|
||
|
|
"projects",
|
||
|
|
None,
|
||
|
|
None,
|
||
|
|
).await.unwrap();
|
||
|
|
|
||
|
|
// Run your tests...
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### File-Based Tests
|
||
|
|
|
||
|
|
```rust
|
||
|
|
#[tokio::test]
|
||
|
|
async fn test_persistence() {
|
||
|
|
let db_path = "/tmp/test_surrealdb.db";
|
||
|
|
|
||
|
|
let db = SurrealDatabase::new_file(db_path).await.unwrap();
|
||
|
|
|
||
|
|
// Create data
|
||
|
|
let project = DbProject { /* ... */ };
|
||
|
|
db.create_project(&project).await.unwrap();
|
||
|
|
|
||
|
|
// Reload and verify persistence
|
||
|
|
let db2 = SurrealDatabase::new_file(db_path).await.unwrap();
|
||
|
|
let retrieved = db2.get_project(&project.id).await.unwrap();
|
||
|
|
assert!(retrieved.is_some());
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Switching Between Backends
|
||
|
|
|
||
|
|
### SQLite to SurrealDB
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Step 1: Update configuration
|
||
|
|
# configs/database.toml - change engine from "sqlite" to "surrealdb"
|
||
|
|
|
||
|
|
# Step 2: Start SurrealDB server
|
||
|
|
surreal start --bind 127.0.0.1:8000 file:///data/surrealdb.db
|
||
|
|
|
||
|
|
# Step 3: Run application with new config
|
||
|
|
RUST_LOG=info cargo run
|
||
|
|
|
||
|
|
# Step 4: Migration (if needed)
|
||
|
|
# See: SURREALDB_2_3_MIGRATION.md
|
||
|
|
```
|
||
|
|
|
||
|
|
### Quick Switching Script
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
# Switch between database backends
|
||
|
|
|
||
|
|
case "$1" in
|
||
|
|
sqlite)
|
||
|
|
echo "Switching to SQLite..."
|
||
|
|
cp configs/database.toml configs/database.toml.backup
|
||
|
|
cp configs/database-default.toml configs/database.toml
|
||
|
|
echo "✓ Using SQLite"
|
||
|
|
;;
|
||
|
|
surrealdb)
|
||
|
|
echo "Switching to SurrealDB..."
|
||
|
|
cp configs/database.toml configs/database.toml.backup
|
||
|
|
cp configs/database-surrealdb.toml configs/database.toml
|
||
|
|
echo "Starting SurrealDB server..."
|
||
|
|
surreal start --bind 127.0.0.1:8000 memory &
|
||
|
|
echo "✓ Using SurrealDB"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
echo "Usage: $0 {sqlite|surrealdb}"
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### "Connection refused" Error
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check if SurrealDB is running
|
||
|
|
ps aux | grep surreal
|
||
|
|
|
||
|
|
# If not, start it
|
||
|
|
surreal start --bind 127.0.0.1:8000 memory
|
||
|
|
|
||
|
|
# Test connection
|
||
|
|
curl http://localhost:8000/health
|
||
|
|
# Should return: {"status":"ok"}
|
||
|
|
```
|
||
|
|
|
||
|
|
### "Authentication failed" Error
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Make sure credentials match server startup
|
||
|
|
let db = SurrealDatabase::new_server(
|
||
|
|
"ws://localhost:8000",
|
||
|
|
"syntaxis",
|
||
|
|
"projects",
|
||
|
|
Some("admin"), // Must match --username
|
||
|
|
Some("your_password"), // Must match --password
|
||
|
|
).await?;
|
||
|
|
```
|
||
|
|
|
||
|
|
### "Database already in use" Error
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Port 8000 is already in use
|
||
|
|
# Use a different port
|
||
|
|
surreal start --bind 127.0.0.1:8001 memory
|
||
|
|
|
||
|
|
# Update configuration
|
||
|
|
[surrealdb]
|
||
|
|
url = "ws://localhost:8001" # New port
|
||
|
|
```
|
||
|
|
|
||
|
|
### Slow Queries
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Enable query logging
|
||
|
|
surreal start --log debug --bind 127.0.0.1:8000 memory
|
||
|
|
|
||
|
|
# Check output for slow queries in logs
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Common Patterns
|
||
|
|
|
||
|
|
### Pattern 1: Batch Operations
|
||
|
|
|
||
|
|
```rust
|
||
|
|
async fn create_multiple_items(
|
||
|
|
db: &dyn Database,
|
||
|
|
items: Vec<DbChecklistItem>,
|
||
|
|
) -> Result<()> {
|
||
|
|
for item in items {
|
||
|
|
db.create_checklist_item(&item).await?;
|
||
|
|
}
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Pattern 2: Error Handling
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::error::LifecycleError;
|
||
|
|
|
||
|
|
match db.get_project(&id).await {
|
||
|
|
Ok(Some(project)) => println!("Found: {}", project.name),
|
||
|
|
Ok(None) => println!("Project not found"),
|
||
|
|
Err(LifecycleError::Database(msg)) => eprintln!("DB error: {}", msg),
|
||
|
|
Err(e) => eprintln!("Other error: {}", e),
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Pattern 3: Configuration-Driven
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use workspace_core::DatabaseConfig;
|
||
|
|
|
||
|
|
let config = DatabaseConfig::load_from_file("configs/database.toml")?;
|
||
|
|
|
||
|
|
let db = match config.engine.as_str() {
|
||
|
|
"surrealdb" => {
|
||
|
|
let surreal_config = config.surrealdb.ok_or("No SurrealDB config")?;
|
||
|
|
SurrealDatabase::new_server(
|
||
|
|
&surreal_config.url,
|
||
|
|
&surreal_config.namespace,
|
||
|
|
&surreal_config.database,
|
||
|
|
surreal_config.username,
|
||
|
|
surreal_config.password,
|
||
|
|
).await?
|
||
|
|
}
|
||
|
|
"sqlite" => {
|
||
|
|
// ... SQLite setup ...
|
||
|
|
}
|
||
|
|
_ => return Err("Unknown database engine".into()),
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Performance Tips
|
||
|
|
|
||
|
|
### 1. Use Connection Pooling
|
||
|
|
|
||
|
|
```toml
|
||
|
|
[surrealdb]
|
||
|
|
max_connections = 20 # Tune based on load
|
||
|
|
timeout_secs = 60 # Increase for slow networks
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Batch Operations
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Good: Multiple operations
|
||
|
|
for item in items {
|
||
|
|
db.create_checklist_item(&item).await?;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Could be optimized with batch API (if available)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Index Critical Fields
|
||
|
|
|
||
|
|
```surreql
|
||
|
|
-- In SurrealDB SQL
|
||
|
|
DEFINE INDEX idx_project_phase ON TABLE projects COLUMNS current_phase;
|
||
|
|
DEFINE INDEX idx_item_project ON TABLE checklist_items COLUMNS project_id;
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. **Choose Deployment Mode**
|
||
|
|
- Development: `mem://` (in-memory, fastest)
|
||
|
|
- Testing: `file://` (persistent, local)
|
||
|
|
- Production: Server mode with Docker/K8s
|
||
|
|
|
||
|
|
2. **Configure Application**
|
||
|
|
- Copy appropriate config template
|
||
|
|
- Update `configs/database.toml`
|
||
|
|
- Set environment variables if needed
|
||
|
|
|
||
|
|
3. **Test Connection**
|
||
|
|
- Run: `cargo run -p syntaxis-cli`
|
||
|
|
- Execute: `syntaxis-cli checklist show`
|
||
|
|
- Verify: Data is being stored
|
||
|
|
|
||
|
|
4. **Learn More**
|
||
|
|
- [SURREALDB_SETUP_GUIDE.md](SURREALDB_SETUP_GUIDE.md) - Detailed setup
|
||
|
|
- [SURREALDB_2_3_MIGRATION.md](SURREALDB_2_3_MIGRATION.md) - Migration guide
|
||
|
|
- [PERSISTENCE_QUICK_START.md](PERSISTENCE_QUICK_START.md) - Generic DB usage
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- **Official**: https://surrealdb.com/
|
||
|
|
- **Docs**: https://surrealdb.com/docs
|
||
|
|
- **GitHub**: https://github.com/surrealdb/surrealdb
|
||
|
|
- **Docker**: https://hub.docker.com/r/surrealdb/surrealdb
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Status**: ✅ Production Ready
|
||
|
|
**Last Updated**: November 15, 2025
|
||
|
|
**SurrealDB Version**: 2.3
|
||
|
|
|