Tables
SQL-based relational storage for structured data.
Overview
Tables provide a familiar SQL interface for storing and querying structured data. Built on Turso (SQLite-compatible), they support schemas, indexes, and relational queries.
Creating Tables
Via Lux Studio
- Navigate to Data → Tables
- Click New Table
- Enter name and description
- Define columns and types
Via CLI
lux data tables init user.customers "Customer data"Note: Table names must start with user. prefix.
Table Schema
Define your table structure with columns and types.
Column Types
| Type | Description | Example |
|---|---|---|
TEXT | String data | Names, emails, descriptions |
INTEGER | Whole numbers | IDs, counts, ages |
REAL | Decimal numbers | Prices, percentages |
BLOB | Binary data | Files, images |
BOOLEAN | True/false | Flags, toggles |
Column Properties
primaryKey- Unique identifier for the rownotNull- Value is requiredunique- Value must be unique across rowsdefault- Default value if not provided
Schema Example
{
"columns": [
{ "name": "id", "type": "TEXT", "primaryKey": true, "notNull": true },
{ "name": "email", "type": "TEXT", "notNull": true, "unique": true },
{ "name": "name", "type": "TEXT" },
{ "name": "created_at", "type": "TEXT", "notNull": true },
{ "name": "order_count", "type": "INTEGER", "default": 0 }
],
"indexes": [
{ "name": "idx_email", "columns": ["email"], "unique": true }
]
}CRUD Operations
Create (Insert)
# CLI
lux data tables insert tbl_123 '{"id":"cust_1","email":"user@example.com","name":"Jane"}'// In Flow
{
"tableId": "tbl_123",
"data": {
"id": "{{generateUuid}}",
"email": "{{body.email}}",
"name": "{{body.name}}",
"created_at": "{{now}}"
}
}Read (Query)
# CLI
lux data tables query tbl_123 "SELECT * FROM \"user.customers\" WHERE order_count > 5"// In Flow (Fetch Data node)
{
"tableId": "tbl_123",
"query": "SELECT * FROM \"user.customers\" WHERE email = '{{email}}'"
}Update
# CLI
lux data tables update tbl_123 cust_1 id '{"order_count":10}'// In Flow (Update Data node)
{
"tableId": "tbl_123",
"filter": { "id": "{{customerId}}" },
"updates": {
"order_count": "{{orderCount + 1}}",
"last_order_at": "{{now}}"
}
}Delete
# CLI
lux data tables delete-row tbl_123 cust_1 idQuerying
Use standard SQL syntax for queries:
-- Basic select
SELECT * FROM "user.customers" WHERE status = 'active'
-- With ordering
SELECT * FROM "user.orders" ORDER BY created_at DESC LIMIT 10
-- Aggregation
SELECT COUNT(*) as total, status FROM "user.orders" GROUP BY status
-- Joins (if you have relationships)
SELECT c.name, o.total
FROM "user.customers" c
JOIN "user.orders" o ON c.id = o.customer_idImport/Export
Export to CSV
lux data tables export tbl_123 ./customers.csvImport from CSV
lux data tables import tbl_123 ./customers.csvMigrations
When you need to change the schema:
- Add new columns with defaults
- Migrate data if needed
- Remove old columns (careful!)
lux data tables migrate tbl_123 --add-column "phone TEXT"Best Practices
- Use meaningful IDs - UUIDs or semantic IDs (e.g.,
cust_abc123) - Index frequently queried columns - Speeds up searches
- Normalize when appropriate - Separate tables for different entities
- Use timestamps - Track created_at, updated_at
- Validate in Flows - Check data before inserting
Next: KV Store →