🐚 🗄️ TuskLang Bash @sql Function Guide
🗄️ TuskLang Bash @sql Function Guide
"We don't bow to any king" – SQL is your configuration's database.
The @sql function in TuskLang is your database powerhouse, enabling dynamic SQL query execution, database management, and data manipulation directly within your configuration files. Whether you're querying databases, managing schemas, or performing complex data operations, @sql provides the power and flexibility to work with databases seamlessly.
🎯 What is @sql?
The @sql function provides SQL database operations in TuskLang. It offers: - SQL query execution - Execute SQL queries and return results - Database management - Create, modify, and manage databases - Schema operations - Create and modify database schemas - Data manipulation - Insert, update, delete, and query data - Transaction management - Handle database transactions📝 Basic @sql Syntax
Simple SQL Queries
[simple_queries]
Basic SELECT query
user_count: @sql("SELECT COUNT(*) FROM users")
active_users: @sql("SELECT COUNT(*) FROM users WHERE status = 'active'")
recent_orders: @sql("SELECT * FROM orders WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)")Query with parameters
$user_id: 123
user_info: @sql("SELECT * FROM users WHERE id = ?", $user_id)
Database Operations
[database_operations]
Create database
create_db: @sql("CREATE DATABASE IF NOT EXISTS tusklang_app")Create table
create_table: @sql("""
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")Insert data
insert_user: @sql("INSERT INTO users (name, email) VALUES (?, ?)", "John Doe", "john@example.com")
Complex Queries
[complex_queries]
Join query
user_orders: @sql("""
SELECT u.name, COUNT(o.id) as order_count, SUM(o.amount) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY u.id
HAVING total_spent > 100
ORDER BY total_spent DESC
""")Subquery
top_customers: @sql("""
SELECT name, email, total_spent
FROM (
SELECT u.name, u.email, SUM(o.amount) as total_spent
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id
) as customer_totals
WHERE total_spent > (SELECT AVG(total_spent) FROM customer_totals)
""")
🚀 Quick Start Example
#!/bin/bash
source tusk-bash.shcat > sql-quickstart.tsk << 'EOF'
[database_setup]
Create database and tables
create_database: @sql("CREATE DATABASE IF NOT EXISTS tusklang_demo")
use_database: @sql("USE tusklang_demo")create_users_table: @sql("""
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
status ENUM('active', 'inactive') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
create_orders_table: @sql("""
CREATE TABLE IF NOT EXISTS orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2) NOT NULL,
status ENUM('pending', 'completed', 'cancelled') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
)
""")
[data_operations]
Insert sample data
insert_users: @sql("""
INSERT INTO users (name, email) VALUES
('Alice Johnson', 'alice@example.com'),
('Bob Smith', 'bob@example.com'),
('Charlie Brown', 'charlie@example.com')
""")insert_orders: @sql("""
INSERT INTO orders (user_id, amount, status) VALUES
(1, 150.00, 'completed'),
(1, 75.50, 'completed'),
(2, 200.00, 'pending'),
(3, 125.25, 'completed')
""")
[query_operations]
Query data
total_users: @sql("SELECT COUNT(*) FROM users")
active_users: @sql("SELECT COUNT(*) FROM users WHERE status = 'active'")
total_orders: @sql("SELECT COUNT(*) FROM orders")
total_revenue: @sql("SELECT SUM(amount) FROM orders WHERE status = 'completed'")Complex query
user_summary: @sql("""
SELECT
u.name,
COUNT(o.id) as order_count,
SUM(o.amount) as total_spent,
AVG(o.amount) as avg_order
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name
ORDER BY total_spent DESC
""")
EOFconfig=$(tusk_parse sql-quickstart.tsk)
echo "=== Database Setup ==="
echo "Database created: $(tusk_get "$config" database_setup.create_database)"
echo "Tables created: $(tusk_get "$config" database_setup.create_users_table)"
echo ""
echo "=== Data Operations ==="
echo "Users inserted: $(tusk_get "$config" data_operations.insert_users)"
echo "Orders inserted: $(tusk_get "$config" data_operations.insert_orders)"
echo ""
echo "=== Query Results ==="
echo "Total Users: $(tusk_get "$config" query_operations.total_users)"
echo "Active Users: $(tusk_get "$config" query_operations.active_users)"
echo "Total Orders: $(tusk_get "$config" query_operations.total_orders)"
echo "Total Revenue: $(tusk_get "$config" query_operations.total_revenue)"
echo "User Summary: $(tusk_get "$config" query_operations.user_summary)"
🔗 Real-World Use Cases
1. E-commerce Analytics
[ecommerce_analytics]
Comprehensive e-commerce analytics
$sales_analytics: {
"daily_sales": @sql("""
SELECT
DATE(created_at) as sale_date,
COUNT(*) as order_count,
SUM(amount) as total_revenue,
AVG(amount) as avg_order_value
FROM orders
WHERE status = 'completed'
AND created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DATE(created_at)
ORDER BY sale_date DESC
"""),
"product_performance": @sql("""
SELECT
p.name as product_name,
COUNT(oi.id) as units_sold,
SUM(oi.quantity * oi.price) as revenue,
AVG(oi.price) as avg_price
FROM products p
JOIN order_items oi ON p.id = oi.product_id
JOIN orders o ON oi.order_id = o.id
WHERE o.status = 'completed'
GROUP BY p.id, p.name
ORDER BY revenue DESC
LIMIT 10
"""),
"customer_segments": @sql("""
SELECT
CASE
WHEN total_spent >= 1000 THEN 'VIP'
WHEN total_spent >= 500 THEN 'Premium'
WHEN total_spent >= 100 THEN 'Regular'
ELSE 'New'
END as segment,
COUNT(*) as customer_count,
AVG(total_spent) as avg_spent
FROM (
SELECT u.id, SUM(o.amount) as total_spent
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed'
GROUP BY u.id
) as customer_totals
GROUP BY segment
""")
}Generate analytics report
$analytics_report: {
"report_date": @date("Y-m-d H:i:s"),
"total_customers": @sql("SELECT COUNT(*) FROM users"),
"total_orders": @sql("SELECT COUNT(*) FROM orders"),
"total_revenue": @sql("SELECT SUM(amount) FROM orders WHERE status = 'completed'"),
"avg_order_value": @sql("SELECT AVG(amount) FROM orders WHERE status = 'completed'"),
"daily_sales": $sales_analytics.daily_sales,
"top_products": $sales_analytics.product_performance,
"customer_segments": $sales_analytics.customer_segments
}
2. User Management System
[user_management]
User management operations
$user_operations: {
"create_user": @sql("""
INSERT INTO users (name, email, password_hash, role, status)
VALUES (?, ?, ?, ?, ?)
""", "New User", "newuser@example.com", @encrypt.hash("password123", "bcrypt"), "user", "active"),
"update_user": @sql("""
UPDATE users
SET name = ?, email = ?, role = ?, updated_at = NOW()
WHERE id = ?
""", "Updated Name", "updated@example.com", "admin", 1),
"deactivate_user": @sql("""
UPDATE users
SET status = 'inactive', deactivated_at = NOW()
WHERE id = ?
""", 2),
"get_user_permissions": @sql("""
SELECT p.name as permission_name, p.description
FROM user_roles ur
JOIN role_permissions rp ON ur.role_id = rp.role_id
JOIN permissions p ON rp.permission_id = p.id
WHERE ur.user_id = ?
""", 1)
}User analytics
$user_analytics: {
"active_users": @sql("SELECT COUNT(*) FROM users WHERE status = 'active'"),
"users_by_role": @sql("""
SELECT role, COUNT(*) as count
FROM users
WHERE status = 'active'
GROUP BY role
"""),
"recent_registrations": @sql("""
SELECT name, email, created_at
FROM users
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY created_at DESC
"""),
"inactive_users": @sql("""
SELECT name, email, last_login
FROM users
WHERE status = 'inactive'
AND last_login < DATE_SUB(NOW(), INTERVAL 30 DAY)
""")
}
3. Inventory Management
[inventory_management]
Inventory tracking and management
$inventory_operations: {
"check_stock": @sql("""
SELECT
p.name as product_name,
p.sku,
i.quantity as current_stock,
i.reorder_level,
CASE
WHEN i.quantity <= i.reorder_level THEN 'Low Stock'
WHEN i.quantity = 0 THEN 'Out of Stock'
ELSE 'In Stock'
END as stock_status
FROM products p
JOIN inventory i ON p.id = i.product_id
WHERE i.quantity <= i.reorder_level
ORDER BY i.quantity ASC
"""),
"update_stock": @sql("""
UPDATE inventory
SET quantity = quantity + ?, updated_at = NOW()
WHERE product_id = ?
""", 50, 1),
"stock_movement": @sql("""
SELECT
p.name as product_name,
sm.type as movement_type,
sm.quantity,
sm.reason,
sm.created_at
FROM stock_movements sm
JOIN products p ON sm.product_id = p.id
WHERE sm.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY sm.created_at DESC
"""),
"low_stock_alert": @sql("""
SELECT
p.name as product_name,
p.sku,
i.quantity as current_stock,
i.reorder_level,
(i.reorder_level - i.quantity) as units_needed
FROM products p
JOIN inventory i ON p.id = i.product_id
WHERE i.quantity <= i.reorder_level
ORDER BY (i.reorder_level - i.quantity) DESC
""")
}Inventory analytics
$inventory_analytics: {
"total_products": @sql("SELECT COUNT(*) FROM products"),
"low_stock_count": @sql("""
SELECT COUNT(*)
FROM inventory
WHERE quantity <= reorder_level
"""),
"out_of_stock_count": @sql("""
SELECT COUNT(*)
FROM inventory
WHERE quantity = 0
"""),
"total_inventory_value": @sql("""
SELECT SUM(i.quantity * p.price)
FROM inventory i
JOIN products p ON i.product_id = p.id
""")
}
4. Financial Reporting
[financial_reporting]
Financial reporting and analysis
$financial_operations: {
"monthly_revenue": @sql("""
SELECT
YEAR(created_at) as year,
MONTH(created_at) as month,
SUM(amount) as revenue,
COUNT(*) as order_count,
AVG(amount) as avg_order
FROM orders
WHERE status = 'completed'
AND created_at >= DATE_SUB(NOW(), INTERVAL 12 MONTH)
GROUP BY YEAR(created_at), MONTH(created_at)
ORDER BY year DESC, month DESC
"""),
"customer_lifetime_value": @sql("""
SELECT
u.name,
u.email,
COUNT(o.id) as total_orders,
SUM(o.amount) as total_spent,
AVG(o.amount) as avg_order_value,
MAX(o.created_at) as last_order_date
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed'
GROUP BY u.id, u.name, u.email
ORDER BY total_spent DESC
"""),
"refund_analysis": @sql("""
SELECT
DATE(created_at) as refund_date,
COUNT(*) as refund_count,
SUM(amount) as refund_amount,
AVG(amount) as avg_refund
FROM refunds
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DATE(created_at)
ORDER BY refund_date DESC
"""),
"profit_margin": @sql("""
SELECT
p.name as product_name,
p.price as selling_price,
p.cost as product_cost,
(p.price - p.cost) as profit,
((p.price - p.cost) / p.price * 100) as margin_percentage
FROM products p
ORDER BY margin_percentage DESC
""")
}Financial summary
$financial_summary: {
"total_revenue": @sql("SELECT SUM(amount) FROM orders WHERE status = 'completed'"),
"total_refunds": @sql("SELECT SUM(amount) FROM refunds"),
"net_revenue": @sql("""
SELECT
(SELECT SUM(amount) FROM orders WHERE status = 'completed') -
(SELECT COALESCE(SUM(amount), 0) FROM refunds)
"""),
"avg_order_value": @sql("SELECT AVG(amount) FROM orders WHERE status = 'completed'"),
"top_customers": $financial_operations.customer_lifetime_value
}
🧠 Advanced @sql Patterns
Transaction Management
[transaction_management]
Handle database transactions
$transaction_operations: {
"transfer_funds": @sql.transaction("""
BEGIN;
-- Deduct from source account
UPDATE accounts
SET balance = balance - ?
WHERE id = ? AND balance >= ?;
-- Add to destination account
UPDATE accounts
SET balance = balance + ?
WHERE id = ?;
-- Record transaction
INSERT INTO transactions (from_account, to_account, amount, type)
VALUES (?, ?, ?, 'transfer');
COMMIT;
""", 100.00, 1, 100.00, 100.00, 2, 1, 2, 100.00),
"batch_insert": @sql.transaction("""
BEGIN;
INSERT INTO users (name, email) VALUES
('User1', 'user1@example.com'),
('User2', 'user2@example.com'),
('User3', 'user3@example.com');
INSERT INTO user_profiles (user_id, bio) VALUES
(LAST_INSERT_ID()-2, 'Bio for User1'),
(LAST_INSERT_ID()-1, 'Bio for User2'),
(LAST_INSERT_ID(), 'Bio for User3');
COMMIT;
""")
}
Dynamic Query Building
[dynamic_queries]
Build dynamic SQL queries
$query_builder: {
"build_user_query": @sql.dynamic("""
SELECT id, name, email, status, created_at
FROM users
WHERE 1=1
{{#if name_filter}}
AND name LIKE ?
{{/if}}
{{#if status_filter}}
AND status = ?
{{/if}}
{{#if date_filter}}
AND created_at >= ?
{{/if}}
ORDER BY created_at DESC
LIMIT ?
""", {
"name_filter": @env("NAME_FILTER"),
"status_filter": @env("STATUS_FILTER"),
"date_filter": @env("DATE_FILTER"),
"limit": @env("QUERY_LIMIT", "100")
}),
"build_search_query": @sql.dynamic("""
SELECT p.*, c.name as category_name
FROM products p
JOIN categories c ON p.category_id = c.id
WHERE 1=1
{{#if search_term}}
AND (p.name LIKE ? OR p.description LIKE ?)
{{/if}}
{{#if category_id}}
AND p.category_id = ?
{{/if}}
{{#if min_price}}
AND p.price >= ?
{{/if}}
{{#if max_price}}
AND p.price <= ?
{{/if}}
ORDER BY p.created_at DESC
""", {
"search_term": @env("SEARCH_TERM"),
"category_id": @env("CATEGORY_ID"),
"min_price": @env("MIN_PRICE"),
"max_price": @env("MAX_PRICE")
})
}
Performance Optimization
[performance_optimization]
Optimize SQL queries for performance
$optimized_queries: {
"indexed_query": @sql("""
SELECT u.name, COUNT(o.id) as order_count
FROM users u
USE INDEX (idx_users_status_created)
LEFT JOIN orders o USE INDEX (idx_orders_user_status)
ON u.id = o.user_id AND o.status = 'completed'
WHERE u.status = 'active'
AND u.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY u.id, u.name
HAVING order_count > 0
"""),
"partitioned_query": @sql("""
SELECT
DATE(created_at) as order_date,
COUNT(*) as order_count,
SUM(amount) as daily_revenue
FROM orders PARTITION (p2024)
WHERE created_at >= '2024-01-01'
AND created_at < '2025-01-01'
GROUP BY DATE(created_at)
ORDER BY order_date DESC
"""),
"cached_query": @sql.cached("""
SELECT
category_id,
COUNT(*) as product_count,
AVG(price) as avg_price
FROM products
WHERE status = 'active'
GROUP BY category_id
""", "5m")
}
🛡️ Security & Performance Notes
- SQL injection prevention: Use parameterized queries and input validation - Query optimization: Use indexes and optimize complex queries - Transaction safety: Use transactions for data consistency - Connection pooling: Implement proper connection management - Query timeout: Set appropriate timeouts for long-running queries - Access control: Implement proper database permissions🐞 Troubleshooting
- Connection issues: Check database connectivity and credentials - Query performance: Monitor slow queries and optimize indexes - Transaction deadlocks: Implement proper transaction ordering - Memory usage: Monitor query result sizes and implement pagination - Data consistency: Use transactions for multi-step operations💡 Best Practices
- Use parameterized queries: Prevent SQL injection attacks - Optimize queries: Use indexes and avoid SELECT * - Handle transactions: Use transactions for data consistency - Monitor performance: Track query execution times - Implement caching: Cache frequently accessed data - Validate input: Validate all user inputs before queries🔗 Cross-References
- @ Operator Introduction - @query Function - Database Integration - Performance Optimization - Security Best Practices---
Master @sql in TuskLang and wield the power of databases in your configurations. 🗄️