Data
Tables

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

  1. Navigate to DataTables
  2. Click New Table
  3. Enter name and description
  4. 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

TypeDescriptionExample
TEXTString dataNames, emails, descriptions
INTEGERWhole numbersIDs, counts, ages
REALDecimal numbersPrices, percentages
BLOBBinary dataFiles, images
BOOLEANTrue/falseFlags, toggles

Column Properties

  • primaryKey - Unique identifier for the row
  • notNull - Value is required
  • unique - Value must be unique across rows
  • default - 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 id

Querying

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_id

Import/Export

Export to CSV

lux data tables export tbl_123 ./customers.csv

Import from CSV

lux data tables import tbl_123 ./customers.csv

Migrations

When you need to change the schema:

  1. Add new columns with defaults
  2. Migrate data if needed
  3. 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 →