Workflows
Blocks
Database
SQLite

SQLite Database Block

What is SQLite?

SQLite is like a lightweight filing cabinet that lives right inside your application. Unlike big database servers, SQLite is a small, self-contained database that doesn't need a separate server to run. It's perfect for apps that need a simple, reliable database without the complexity.

When to Use SQLite

Perfect for:

  • Small to medium-sized applications
  • Local data storage and caching
  • Development and testing environments
  • Mobile apps and desktop applications
  • Simple websites with moderate traffic
  • Data analysis and reporting tools

Not ideal for:

  • High-traffic websites with many concurrent users
  • Applications requiring advanced database features
  • Multi-server deployments
  • Large-scale enterprise applications
  • Real-time collaborative systems

How It Works

  1. Connect to Database: Provide the SQLite file path
  2. Execute SQL: Run SELECT, INSERT, UPDATE, or DELETE queries
  3. Handle Results: Process the returned data
  4. Manage Transactions: Group operations for data consistency

Real-World Examples

📱 Mobile App Data Storage

User Creates Note → INSERT into notes table → Store locally on device → Sync when online

Perfect for apps that work offline and sync later

📊 Analytics Dashboard

API Data → INSERT into analytics table → Query for charts → Display trends and stats

Store and analyze data without needing a big database server

🏪 Small Business Inventory

Add Product → INSERT into products → Update Stock → Query for reports

Simple inventory management for small businesses

🎮 Game Progress Storage

Player Action → UPDATE player stats → INSERT achievement → Query leaderboard

Store game progress and achievements locally

Easy Setup Guide

🔌 Step 1: Database Connection

File Path Setup:

  • Database File: Path to your SQLite file (like ./data/app.db)
  • Auto-Create: SQLite creates the file if it doesn't exist
  • Permissions: Make sure your app can read/write to the location
// Example file paths
Database_Path = "./database/myapp.db"
Database_Path = "/var/data/analytics.db"  
Database_Path = "C:\\MyApp\\data\\users.db"

⚙️ Step 2: Choose Your Operation

SELECT - Get Data:

SELECT * FROM users WHERE active = 1

INSERT - Add New Data:

INSERT INTO users (name, email, created_at) VALUES (?, ?, ?)

UPDATE - Modify Existing Data:

UPDATE users SET last_login = ? WHERE id = ?

DELETE - Remove Data:

DELETE FROM users WHERE inactive_days > 365

Common Database Operations

📝 Creating Tables

User Management Table:

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    active BOOLEAN DEFAULT 1
)

Product Inventory Table:

CREATE TABLE IF NOT EXISTS products (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    sku TEXT UNIQUE,
    price DECIMAL(10,2),
    stock_quantity INTEGER DEFAULT 0,
    category TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)

Order Tracking Table:

CREATE TABLE IF NOT EXISTS orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,
    product_id INTEGER,
    quantity INTEGER,
    total_amount DECIMAL(10,2),
    status TEXT DEFAULT 'pending',
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
)

🔍 Querying Data

Simple Queries:

-- Get all active users
SELECT * FROM users WHERE active = 1
 
-- Get products with low stock
SELECT name, stock_quantity FROM products WHERE stock_quantity < 10
 
-- Count total orders
SELECT COUNT(*) as total_orders FROM orders
 
-- Get recent orders with user names
SELECT o.id, u.name, o.total_amount, o.order_date 
FROM orders o 
JOIN users u ON o.user_id = u.id 
WHERE o.order_date > date('now', '-7 days')

Advanced Queries:

-- Get top selling products
SELECT p.name, SUM(o.quantity) as total_sold
FROM products p
JOIN orders o ON p.id = o.product_id
GROUP BY p.id, p.name
ORDER BY total_sold DESC
LIMIT 10
 
-- Get monthly sales summary
SELECT 
    strftime('%Y-%m', order_date) as month,
    COUNT(*) as order_count,
    SUM(total_amount) as revenue
FROM orders 
GROUP BY month
ORDER BY month DESC

📥 Inserting Data

Single Record:

INSERT INTO users (name, email) 
VALUES ('{{user_name}}', '{{user_email}}')

Multiple Records:

INSERT INTO products (name, sku, price, stock_quantity, category) VALUES
('Laptop Pro', 'LP001', 1299.99, 50, 'Electronics'),
('Wireless Mouse', 'WM002', 29.99, 200, 'Electronics'),
('Office Chair', 'OC003', 199.99, 25, 'Furniture')

Insert with Data from Workflow:

INSERT INTO orders (user_id, product_id, quantity, total_amount)
VALUES ({{user_id}}, {{product_id}}, {{quantity}}, {{calculated_total}})

✏️ Updating Data

Update Single Field:

UPDATE users 
SET last_login = datetime('now') 
WHERE id = {{user_id}}

Update Multiple Fields:

UPDATE products 
SET price = {{new_price}}, 
    stock_quantity = stock_quantity - {{sold_quantity}}
WHERE id = {{product_id}}

Conditional Updates:

UPDATE orders 
SET status = 'shipped', 
    shipped_date = datetime('now')
WHERE status = 'processing' 
AND order_date < date('now', '-2 days')

🗑️ Deleting Data

Delete Specific Records:

DELETE FROM users WHERE active = 0 AND last_login < date('now', '-1 year')

Cleanup Old Data:

DELETE FROM orders WHERE status = 'cancelled' AND order_date < date('now', '-6 months')

Working with Workflow Data

💾 User Registration Workflow

-- Step 1: Check if user exists
SELECT COUNT(*) FROM users WHERE email = '{{user_email}}'
 
-- Step 2: If not exists, create user
INSERT INTO users (name, email, password_hash) 
VALUES ('{{name}}', '{{email}}', '{{hashed_password}}')
 
-- Step 3: Get new user ID
SELECT id FROM users WHERE email = '{{user_email}}'

🛒 E-commerce Order Processing

-- Step 1: Check product availability
SELECT stock_quantity FROM products WHERE id = {{product_id}}
 
-- Step 2: Create order
INSERT INTO orders (user_id, product_id, quantity, total_amount)
VALUES ({{user_id}}, {{product_id}}, {{quantity}}, {{total}})
 
-- Step 3: Update inventory
UPDATE products 
SET stock_quantity = stock_quantity - {{quantity}}
WHERE id = {{product_id}}
 
-- Step 4: Get order details for confirmation
SELECT o.id, p.name, o.quantity, o.total_amount
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.id = {{order_id}}

📊 Analytics and Reporting

-- Daily sales report
SELECT 
    date(order_date) as sale_date,
    COUNT(*) as orders,
    SUM(total_amount) as revenue
FROM orders 
WHERE order_date >= date('now', '-30 days')
GROUP BY date(order_date)
ORDER BY sale_date DESC
 
-- Popular products
SELECT 
    p.name,
    SUM(o.quantity) as total_sold,
    SUM(o.total_amount) as revenue
FROM products p
JOIN orders o ON p.id = o.product_id
WHERE o.order_date >= date('now', '-30 days')
GROUP BY p.id, p.name
ORDER BY total_sold DESC
LIMIT 10

Using Parameters Safely

🔒 Parameterized Queries

Instead of this (unsafe):

-- DON'T DO THIS - SQL injection risk
SELECT * FROM users WHERE name = '${user_input}'

Do this (safe):

-- Use parameters to prevent SQL injection
SELECT * FROM users WHERE name = ?
-- Parameters: [user_input]

Multiple Parameters:

INSERT INTO orders (user_id, product_id, quantity, total_amount)
VALUES (?, ?, ?, ?)
-- Parameters: [user_id, product_id, quantity, total_amount]

Best Practices

For Performance

  • Use Indexes: Create indexes on frequently queried columns
  • Limit Results: Use LIMIT to avoid loading too much data
  • Use Transactions: Group related operations together
  • Optimize Queries: Avoid complex JOINs when possible
-- Create indexes for better performance
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_date ON orders(order_date);
CREATE INDEX idx_products_category ON products(category);

🔒 For Security

  • Always Use Parameters: Never concatenate user input into SQL
  • Validate Input: Check data before inserting
  • Set Proper Permissions: Limit file access to your application
  • Backup Regularly: SQLite files can be easily copied

🎯 For Data Integrity

  • Use Transactions: Ensure all-or-nothing operations
  • Foreign Key Constraints: Maintain data relationships
  • Check Constraints: Validate data at database level
  • Default Values: Set sensible defaults for columns
-- Transaction example
BEGIN TRANSACTION;
INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 5, 2);
UPDATE products SET stock_quantity = stock_quantity - 2 WHERE id = 5;
COMMIT;

Common Use Cases

📱 App Settings Storage

CREATE TABLE app_settings (
    key TEXT PRIMARY KEY,
    value TEXT,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
 
-- Store setting
INSERT OR REPLACE INTO app_settings (key, value) VALUES ('theme', 'dark');
 
-- Get setting
SELECT value FROM app_settings WHERE key = 'theme';

📝 Content Management

CREATE TABLE articles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    content TEXT,
    author TEXT,
    published BOOLEAN DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
 
-- Get published articles
SELECT title, author, created_at FROM articles 
WHERE published = 1 
ORDER BY created_at DESC;

🎯 Task Management

CREATE TABLE tasks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    description TEXT,
    completed BOOLEAN DEFAULT 0,
    priority INTEGER DEFAULT 1,
    due_date DATE,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
 
-- Get pending high-priority tasks
SELECT * FROM tasks 
WHERE completed = 0 AND priority >= 3
ORDER BY due_date ASC;

Troubleshooting

Database Issues

File Not Found:

  • Check if the database file path is correct
  • Ensure the directory exists and is writable
  • Verify file permissions

Database Locked:

  • Another process might be using the database
  • Make sure transactions are properly closed
  • Check for long-running queries

Corruption Issues:

  • Run PRAGMA integrity_check
  • Keep regular backups
  • Use proper transaction handling

🔧 Common Problems

SQL Syntax Errors:

  • Check SQL syntax carefully
  • Use SQLite-specific SQL (not all features from other databases work)
  • Test queries in a SQLite browser tool first

Performance Issues:

  • Add indexes on frequently queried columns
  • Use EXPLAIN QUERY PLAN to analyze slow queries
  • Limit result sets with LIMIT clause
  • Consider using WAL mode for better concurrency

Data Type Issues:

  • SQLite is dynamically typed
  • Be consistent with data types in your application
  • Use proper casting when needed

Node Display

The SQLite block shows:

  • Database File: Path to the SQLite file
  • Operation Type: SELECT, INSERT, UPDATE, DELETE
  • Query Preview: First part of your SQL query
  • Rows Affected: Number of records processed
  • Connection Status: Connected, error, or file not found

Ready to add reliable local database storage to your workflows? SQLite makes it simple to store and query your data without the complexity of a full database server!

Indite Documentation v1.4.0
PrivacyTermsSupport