--- name: dbcli-interactive description: Interactive SQL mode for 30+ databases using DbCli. Provides REPL environment for exploratory queries, rapid prototyping, and database administration. Includes safety prompts before dangerous operations (UPDATE/DELETE/DROP). Use when user wants interactive database session. license: MIT compatibility: Requires DbCli CLI tool (based on .NET 10 and SqlSugar). Supports Windows, Linux, macOS. metadata: tool: dbcli version: "1.0.0" category: database mode: interactive-repl safety-prompts: enabled supported-databases: "30+" allowed-tools: dbcli --- ## Command Style (Use PATH) All examples use the plain command name `dbcli` (no directory prefix). Ensure `dbcli` is on PATH instead of hardcoding paths like `.\.claude\skills\dbcli\dbcli.exe`. # DbCli Interactive Skill Interactive SQL mode (REPL) for database exploration and administration with built-in safety prompts. ## When to Use This Skill - User wants to explore database interactively - User needs to run multiple ad-hoc queries - User prefers REPL environment over one-off commands - User wants to prototype SQL statements - User needs database administration session - Learning/teaching SQL on real databases ## ⚠️ Safety Features Interactive mode includes: - **Safety prompts** before UPDATE/DELETE/DROP operations - **Automatic backup suggestions** for dangerous operations - **Query preview** before execution - **Confirmation dialogs** for destructive commands - **Transaction rollback** support (where available) ## Command Syntax ```bash dbcli -c "CONNECTION_STRING" [-t DATABASE_TYPE] interactive ``` ### Aliases ```bash dbcli -c "CONNECTION_STRING" i # Short form dbcli -c "CONNECTION_STRING" -i # Alternative ``` ## Global Options - `-c, --connection`: Database connection string (required) - `-t, --db-type`: Database type (default: sqlite) ## Starting Interactive Mode ### Basic Usage ```bash # SQLite dbcli -c "Data Source=app.db" interactive # Welcome to DbCli Interactive Mode # Type .help for commands, .exit to quit # dbcli> ``` ### Different Databases ```bash # SQL Server dbcli -c "Server=localhost;Database=mydb;Trusted_Connection=True" -t sqlserver interactive # MySQL dbcli -c "Server=localhost;Database=mydb;Uid=root;Pwd=xxxxxxxxxx" -t mysql interactive # PostgreSQL dbcli -c "Host=localhost;Database=mydb;Username=postgres;Password=xxxxxxxxxx" -t postgresql interactive # DaMeng (达梦) dbcli -c "Server=localhost;User Id=SYSDBA;PWD=xxxxxxxxxx;DATABASE=mydb" -t dm interactive # GaussDB dbcli -c "Host=localhost;Port=8000;Database=mydb;Username=gaussdb;Password=xxxxxxxxxx" -t gaussdb interactive ``` ## Interactive Commands ### Meta Commands (Dot Commands) ``` .help - Show help message .tables - List all tables .columns - Show table structure .format - Change output format (json/table/csv) .exit / .quit - Exit interactive mode .clear - Clear screen .history - Show command history ``` ### SQL Execution ```sql dbcli> SELECT * FROM Users LIMIT 5; -- Results displayed immediately dbcli> SELECT COUNT(*) as user_count FROM Users; -- Returns: { "user_count": 42 } ``` ## Interactive Session Examples ### Exploration Session ```bash $ dbcli -c "Data Source=app.db" interactive dbcli> .tables Users Orders Products dbcli> .columns Users ColumnName | DataType | IsNullable | IsPrimaryKey ------------------------------------------------------- Id | INTEGER | False | True Name | TEXT | False | False Email | TEXT | True | False CreatedAt | TIMESTAMP| True | False dbcli> SELECT * FROM Users LIMIT 3; +----+-------+-------------------+ | Id | Name | Email | +----+-------+-------------------+ | 1 | Alice | alice@example.com | | 2 | Bob | bob@example.com | | 3 | Carol | carol@example.com | +----+-------+-------------------+ dbcli> .format json Output format changed to: json dbcli> SELECT Name, Email FROM Users WHERE Id = 1; [{"Name":"Alice","Email":"alice@example.com"}] dbcli> .exit Goodbye! ``` ### Data Analysis Session ```bash dbcli> -- Check total records dbcli> SELECT COUNT(*) as total FROM Orders; {"total": 1547} dbcli> -- Find top customers dbcli> SELECT CustomerId, COUNT(*) as order_count, SUM(Total) as total_spent FROM Orders GROUP BY CustomerId ORDER BY total_spent DESC LIMIT 5; +------------+-------------+-------------+ | CustomerId | order_count | total_spent | +------------+-------------+-------------+ | 42 | 23 | 15420.50 | | 17 | 19 | 12350.00 | ... dbcli> -- Analyze by month dbcli> SELECT strftime('%Y-%m', OrderDate) as month, COUNT(*) as orders, SUM(Total) as revenue FROM Orders GROUP BY month ORDER BY month DESC LIMIT 6; ``` ## Safety Prompts for Dangerous Operations ### UPDATE with Safety Prompt ```bash dbcli> UPDATE Users SET status = 'verified' WHERE email_confirmed = 1; ⚠️ WARNING: UPDATE operation detected This will modify records in table: Users Preview affected records? (yes/no): yes Records to be updated: +----+--------+----------------------+ | Id | Name | Email | +----+--------+----------------------+ | 5 | John | john@example.com | | 8 | Sarah | sarah@example.com | +----+--------+----------------------+ Estimated affected records: 2 Recommended actions: 1. Create backup: .export Users Users_backup_20250127_143022.sql 2. Create table copy: CREATE TABLE Users_copy_20250127_143022 AS SELECT * FROM Users Create automatic backup before UPDATE? (yes/no): yes Creating backup: Users_backup_20250127_143022.sql... Done. Proceed with UPDATE? (yes/no): yes Executing UPDATE... Updated 2 rows. Backup saved: Users_backup_20250127_143022.sql ``` ### DELETE with Safety Prompt ```bash dbcli> DELETE FROM Orders WHERE status = 'cancelled' AND created_at < date('now', '-365 days'); ⚠️ DANGER: DELETE operation detected This will permanently remove records from table: Orders Preview records to be deleted? (yes/no): yes Records to be deleted: +----+-----------+------------+ | Id | Status | CreatedAt | +----+-----------+------------+ | 23 | cancelled | 2023-05-10 | | 45 | cancelled | 2023-08-22 | ... +----+-----------+------------+ Estimated affected records: 37 ⚠️ This operation CANNOT BE UNDONE without backup! Create automatic backup before DELETE? (yes/no): yes Creating backup: Orders_backup_20250127_143022.sql... Done. Type 'DELETE' to confirm deletion: DELETE Executing DELETE... Deleted 37 rows. Backup saved: Orders_backup_20250127_143022.sql ``` ### DROP TABLE with Critical Warning ```bash dbcli> DROP TABLE TempData; 🛑 CRITICAL WARNING: DROP TABLE operation detected This will PERMANENTLY DESTROY table: TempData Table information: - Records: 1,245 - Columns: 7 - Indexes: 2 - Size: ~450 KB This operation is IRREVERSIBLE! Recommended actions: 1. Export data: .export TempData TempData_backup.sql 2. Export schema: .columns TempData > TempData_schema.txt 3. Create table copy: CREATE TABLE TempData_copy AS SELECT * FROM TempData Create complete backup (data + schema)? (yes/no): yes Creating backups... ✓ Data exported: TempData_backup_20250127_143022.sql ✓ Schema saved: TempData_schema_20250127_143022.txt ✓ Table copy created: TempData_copy_20250127_143022 Type 'DROP TABLE TempData' exactly to confirm: DROP TABLE TempData Executing DROP TABLE... Table 'TempData' has been dropped. Recovery files available in: backups/ ``` ## Special Interactive Features ### Auto-Completion (Planned) ```bash dbcli> SELECT * FROM Us -- Auto-completes to: SELECT * FROM Users dbcli> SELECT Na, Em FROM Users -- Auto-completes column names ``` ### Command History ```bash dbcli> .history 1. SELECT * FROM Users LIMIT 5 2. .tables 3. .columns Orders 4. SELECT COUNT(*) FROM Orders 5. UPDATE Users SET status = 'active' dbcli> !3 -- Re-executes: .columns Orders ``` ### Multi-Line Queries ```sql dbcli> SELECT u.Name, ...> o.OrderDate, ...> o.Total ...> FROM Users u ...> JOIN Orders o ON u.Id = o.UserId ...> WHERE o.Total > 100 ...> ORDER BY o.OrderDate DESC; -- (Press Enter on empty line or end with ';' to execute) ``` ### Transaction Support ```bash dbcli> BEGIN TRANSACTION; Transaction started. dbcli> UPDATE Users SET balance = balance - 100 WHERE Id = 5; Updated 1 row. dbcli> UPDATE Users SET balance = balance + 100 WHERE Id = 8; Updated 1 row. dbcli> -- Check balances dbcli> SELECT Id, Name, balance FROM Users WHERE Id IN (5, 8); +----+-------+---------+ | Id | Name | balance | +----+-------+---------+ | 5 | Alice | 400 | | 8 | Bob | 600 | +----+-------+---------+ dbcli> COMMIT; Transaction committed. -- Or rollback if something wrong: dbcli> ROLLBACK; Transaction rolled back. ``` ## Configuration in Interactive Mode ### Set Output Format ```bash dbcli> .format table Output format: table dbcli> SELECT * FROM Users LIMIT 2; +----+-------+-------------------+ | Id | Name | Email | +----+-------+-------------------+ ... dbcli> .format json Output format: json dbcli> SELECT * FROM Users LIMIT 2; [{"Id":1,"Name":"Alice","Email":"alice@example.com"}...] dbcli> .format csv Output format: csv dbcli> SELECT * FROM Users LIMIT 2; Id,Name,Email 1,Alice,alice@example.com ``` ### Session Variables (Future Feature) ```bash dbcli> .set safety_prompts on Safety prompts enabled dbcli> .set auto_backup on Auto-backup before dangerous operations: enabled dbcli> .set Current settings: safety_prompts: on auto_backup: on output_format: table max_rows: 100 ``` ## Use Cases ### 1. Database Development ```bash # Test query iterations dbcli> SELECT * FROM Products WHERE price > 100; -- Review results dbcli> SELECT * FROM Products WHERE price > 100 AND stock > 0; -- Refine query dbcli> SELECT name, price, stock FROM Products WHERE price > 100 AND stock > 0 ORDER BY price; -- Final query for application ``` ### 2. Data Cleanup ```bash # Find duplicates dbcli> SELECT email, COUNT(*) as count FROM Users GROUP BY email HAVING count > 1; # Review duplicate records dbcli> SELECT * FROM Users WHERE email = 'duplicate@example.com'; # Remove duplicates (with safety prompt) dbcli> DELETE FROM Users WHERE Id IN (SELECT MAX(Id) FROM Users GROUP BY email HAVING COUNT(*) > 1); ⚠️ Safety prompt triggered... ``` ### 3. Database Migration Testing ```bash # Test migration script step by step dbcli> BEGIN TRANSACTION; dbcli> ALTER TABLE Users ADD COLUMN age INTEGER; dbcli> .columns Users -- Verify new column added dbcli> UPDATE Users SET age = 25 WHERE Id = 1; -- Test update dbcli> SELECT * FROM Users WHERE Id = 1; -- Verify data dbcli> COMMIT; -- Or ROLLBACK if issues found ``` ### 4. Quick Data Inspection ```bash # Explore unfamiliar database dbcli> .tables -- See what tables exist dbcli> .columns Users -- Check structure dbcli> SELECT * FROM Users LIMIT 3; -- Sample data dbcli> SELECT COUNT(*) FROM Users; -- Record count ``` ## Scripting with Interactive Mode ### Pipe SQL from File ```bash # Execute script in interactive mode cat migration.sql | dbcli -c "Data Source=app.db" interactive ``` ### Heredoc Script ```bash dbcli -c "Data Source=app.db" interactive < .export Users -- Internally calls: dbcli export Users dbcli> .import backup.sql -- Internally calls: dbcli exec -F backup.sql ``` ## Exit Codes ``` 0 - Normal exit 1 - Connection error 2 - Syntax error in SQL 3 - User cancelled dangerous operation ``` ## Comparison with Other Skills | Feature | Interactive | One-Off Commands | |---------|-------------|------------------| | Speed for single query | Slower (startup overhead) | Faster | | Multiple queries | Much faster | Slower (reconnect each time) | | Exploration | Excellent | Poor | | Safety prompts | Built-in | Manual | | Automation | Limited | Excellent | | Learning curve | Low | Medium | **Use interactive mode when**: Exploring, testing, multiple queries **Use one-off commands when**: Automation, scripts, single operations