Skip to main content

sqlite

SQLite lightweight embedded database, single-file storage, and portable applications

Source facts

Repository
ffsshhttiikk/opencode-agents-skills
Last source activity
February 28, 2026 at 22:49
Detected SKILL.md language
English
Stars
3
Forks
2

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
sqlite
description
SQLite lightweight embedded database, single-file storage, and portable applications
category
databases
# SQLite ## What I do I am a self-contained, serverless, zero-configuration, transactional SQL database engine. I store the entire database in a single file, making me ideal for embedded systems, mobile applications, testing environments, and small to medium web applications. Despite my simplicity, I support most of the SQL standard, including ACID transactions, views, triggers, and full-text search extensions. I am the most widely deployed database engine in the world. ## When to use me - Mobile applications (Android, iOS) - Desktop applications requiring local storage - Browser extensions and plugins - Testing and development environments - Small to medium websites with low to medium traffic - Embedded systems and IoT devices - Data analysis and prototyping - Caching and session storage - Configuration and settings storage - Temporary databases for ETL processes ## Core Concepts 1. **Serverless Architecture**: No separate database server process; database is a single file 2. **Zero Configuration**: No setup, installation, or administration required 3. **ACID Transactions**: Full support for atomic, consistent, isolated, durable transactions 4. **Single File Storage**: Entire database stored in one portable file 5. **SQLite3 File Format**: Stable, cross-platform, and backwards-compatible file format 6. **WAL Mode**: Write-Ahead Logging for better concurrent read/write performance 7. **Full-Text Search (FTS)**: Virtual table module for efficient full-text search 8. **Rowid and Primary Keys**: Auto-incrementing rowid or explicit primary key selection 9. **PRAGMA Statements**: Configuration and diagnostic statements for tuning 10. **Connection Limits**: Recommended connection pool size of 1-2 for file-based locking ## Code Examples ### Basic Connection and CRUD ```python import sqlite3 from contextlib import contextmanager @contextmanager def get_connection(db_path="app.db"): conn = sqlite3.connect(db_path, timeout=30.0) conn.row_factory = sqlite3.Row try: yield conn conn.commit() except Exception: conn.rollback() raise finally: conn.close() def init_database(): with get_connection() as conn: conn.executescript(""" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT UNIQUE NOT NULL, name TEXT NOT NULL, password_hash TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS products ( id INTEGER PRIMARY KEY AUTOINCREMENT, SKU TEXT UNIQUE NOT NULL, name TEXT NOT NULL, description TEXT, price REAL NOT NULL, category TEXT, stock INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_users_email ON users(email); CREATE INDEX IF NOT EXISTS idx_products_sku ON products(SKU); CREATE INDEX IF NOT EXISTS idx_products_category ON products(category); """) def create_user(email, name, password_hash): with get_connection() as conn: cur = conn.execute(""" INSERT INTO users (email, name, password_hash) VALUES (?, ?, ?) """, (email, name, password_hash)) return cur.lastrowid def get_user_by_id(user_id): with get_connection() as conn: row = conn.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone() return dict(row) if row else None def get_user_by_email(email): with get_connection() as conn: row = conn.execute("SELECT * FROM users WHERE email = ?", (email,)).fetchone() return dict(row) if row else None def update_user(user_id, **updates): set_clauses = [f"{k} = ?" for k in updates.keys()] params = list(updates.values()) + [user_id] with get_connection() as conn: conn.execute(f""" UPDATE users SET {', '.join(set_clauses)}, updated_at = CURRENT_TIMESTAMP WHERE id = ? """, params) def delete_user(user_id): with get_connection() as conn: conn.execute("DELETE FROM users WHERE id = ?", (user_id,)) return conn.total_changes > 0 ``` ### Transactions and Concurrency ```python from sqlite3 import IntegrityError def transfer_funds(from_account, to_account, amount): with get_connection() as conn: try: cur = conn.execute("SELECT balance FROM accounts WHERE id = ?", (from_account,)) balance = cur.fetchone() if not balance or balance[0] < amount: raise ValueError("Insufficient funds") conn.execute(""" UPDATE accounts SET balance = balance - ? WHERE id = ? """, (amount, from_account)) conn.execute(""" UPDATE accounts SET balance = balance + ? WHERE id = ? """, (amount, to_account)) conn.execute(""" INSERT INTO transactions (from_account, to_account, amount) VALUES (?, ?, ?) """, (from_account, to_account, amount)) return True except IntegrityError as e: conn.rollback() raise ValueError(f"Transfer failed: {e}") def batch_create_orders(orders_data): with get_connection() as conn: try: order_ids = [] for order in orders_data: cur = conn.execute(""" INSERT INTO orders (user_id, total, status) VALUES (?, ?, 'pending') """, (order["user_id"], order["total"])) order_id = cur.lastrowid for item in order["items"]: conn.execute(""" INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?) """, (order_id, item["product_id"], item["quantity"], item["price"])) order_ids.append(order_id) return order_ids except Exception as e: conn.rollback() raise e def safe_concurrent_update(key, value, expected_version): with get_connection() as conn: cur = conn.execute(""" UPDATE settings SET value = ?, version = version + 1 WHERE key = ? AND version = ? """, (value, key, expected_version)) if cur.rowcount == 0: raise ValueError("Concurrent modification detected") return True ``` ### Advanced Queries and Data Analysis ```python def get_sales_summary(start_date, end_date): with get_connection() as conn: rows = conn.execute(""" SELECT DATE(o.created_at) as sale_date, COUNT(*) as order_count, SUM(o.total) as total_revenue, AVG(o.total) as avg_order_value FROM orders o WHERE o.created_at BETWEEN ? AND ? GROUP BY DATE(o.created_at) ORDER BY sale_date """, (start_date, end_date)).fetchall() return [{"date": row[0], "orders": row[1], "revenue": row[2], "avg_order": row[3]} for row in rows] def get_top_products(limit=10): with get_connection() as conn: rows = conn.execute(""" SELECT p.id, p.name, p.category, COUNT(oi.id) as total_sold, SUM(oi.quantity) as total_quantity, SUM(oi.quantity * oi.price) as total_revenue FROM products p LEFT JOIN order_items oi ON p.id = oi.product_id LEFT JOIN orders o ON oi.order_id = o.id AND o.status != 'cancelled' GROUP BY p.id ORDER BY total_revenue DESC LIMIT ? """, (limit,)).fetchall() return [dict(row) for row in rows] def get_user_statistics(): with get_connection() as conn: stats = {} stats["total_users"] = conn.execute("SELECT COUNT(*) FROM users").fetchone()[0] stats["users_by_month"] = conn.execute(""" SELECT strftime('%Y-%m', created_at) as month, COUNT(*) as count FROM users GROUP BY month ORDER BY month DESC """).fetchall() stats["active_orders"] = conn.execute(""" SELECT COUNT(*) FROM orders WHERE status NOT IN ('cancelled', 'delivered') "").fetchone()[0] return stats def get_running_totals(): with get_connection() as conn: conn.execute(""" SELECT date, revenue, SUM(revenue) OVER (ORDER BY date) as running_total FROM daily_revenue ORDER BY date """) def recursive_category_tree(): with get_connection() as conn: conn.execute(""" WITH RECURSIVE category_tree AS ( SELECT id, name, parent_id, 0 as level FROM categories WHERE parent_id IS NULL UNION ALL SELECT c.id, c.name, c.parent_id, ct.level + 1 FROM categories c JOIN category_tree ct ON c.parent_id = ct.id ) SELECT * FROM category_tree ORDER BY level, name """) ``` ### Full-Text Search Extension ```python def create_fts_table(): with get_connection() as conn: conn.executescript(""" CREATE VIRTUAL TABLE products_fts USING fts5( name, description, category, content='products', content_rowid='id' ); CREATE TRIGGER products_ai AFTER INSERT ON products BEGIN INSERT INTO products_fts(rowid, name, description, category) VALUES (new.id, new.name, new.description, new.category); END; CREATE TRIGGER products_ad AFTER DELETE ON products BEGIN INSERT INTO products_fts(products_fts, rowid, name, description, category) VALUES ('delete', old.id, old.name, old.description, old.category); END; CREATE TRIGGER products_au AFTER UPDATE ON products BEGIN INSERT INTO products_fts(products_fts, rowid, name, description, category) VALUES ('delete', old.id, old.name, old.description, old.category); INSERT INTO products_fts(rowid, name, description, category) VALUES (new.id, new.name, new.description, new.category); END; """) def search_products(query, limit=50): with get_connection() as conn: rows = conn.execute(""" SELECT p.*, bm25(products_fts) as score FROM products_fts JOIN products p ON products_fts.rowid = p.id WHERE products_fts MATCH ? ORDER BY score LIMIT ? """, (query, limit)).fetchall() return [dict(row) for row in rows] def search_with_highlight(query): with get_connection() as conn: rows = conn.execute(""" SELECT p.id, p.name, p.description, snippet(products_fts, 0, '<b>', '</b>', '...', 10) as name_snippet, snippet(products_fts, 1, '<b>', '</b>', '...', 10) as desc_snippet FROM products_fts JOIN products p ON products_fts.rowid = p.id WHERE products_fts MATCH ? LIMIT 20 """, (query,)).fetchall() return [dict(row) for row in rows] ``` ### Backup and Maintenance ```python import shutil import os def backup_database(source_path, backup_path): shutil.copy2(source_path, backup_path) return backup_path def vacuum_database(db_path="app.db"): with get_connection(db_path) as conn: conn.execute("VACUUM") def integrity_check(db_path="app.db"): with get_connection(db_path) as conn: rows = conn.execute("PRAGMA integrity_check").fetchall() return all(row[0] == "ok" for row in rows) def get_table_info(table_name): with get_connection() as conn: rows = conn.execute(f"PRAGMA table_info({table_name})").fetchall() return [{"name": row[1], "type": row[2], "notnull": row[3], "pk": row[5]} for row in rows] def get_database_size(db_path="app.db"): return os.path.getsize(db_path) if os.path.exists(db_path) else 0 def enable_wal_mode(db_path="app.db"): with get_connection(db_path) as conn: conn.execute("PRAGMA journal_mode=WAL") conn.execute("PRAGMA synchronous=NORMAL") conn.execute("PRAGMA cache_size=-64000") conn.execute("PRAGMA temp_store=MEMORY") def show_tables(): with get_connection() as conn: rows = conn.execute(""" SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name """).fetchall() return [row[0] for row in rows] ``` ## Best Practices 1. **Use WAL Mode for Better Concurrency**: Enable WAL mode for concurrent read/write performance 2. **Use Parameterized Queries**: Always use parameterized queries to prevent SQL injection 3. **Implement Connection Pooling**: For web applications, use connection pooling libraries 4. **Enable Foreign Keys**: Execute PRAGMA foreign_keys=ON to enforce referential integrity 5. **Use Transactions for Bulk Operations**: Wrap multiple operations in transactions for performance 6. **Add Indexes for Query Optimization**: Create indexes on frequently queried columns 7. **Regular Maintenance**: Run VACUUM periodically to reclaim space and optimize database 8. **Use Appropriate Data Types**: SQLite is flexible but choose appropriate types for compatibility 9. **Handle Timeouts for Concurrent Access**: Set appropriate timeout for busy databases 10. **Backup Regularly**: Use online backup API or file copy for reliable backups
View on GitHub