SQL Plugin
Execute SQL queries and validate database state in your tests.
Supported Databases
| Database | Driver | DSN Format | 
|---|---|---|
| PostgreSQL | postgres | 
postgres://user:pass@host:port/db?sslmode=disable | 
| MySQL | mysql | 
user:pass@tcp(host:port)/db | 
| SQLite | sqlite | 
./path/to/database.db | 
| SQL Server | sqlserver | 
sqlserver://user:pass@host:port?database=db | 
Quick Start
- name: "Query database"
  plugin: sql
  config:
    driver: postgres
    dsn: "{{ .env.DATABASE_URL }}"
    commands:
      - "SELECT id, name FROM users WHERE active = true;"
  assertions:
    - type: row_count
      query_index: 0
      expected: 5
  save:
    - sql_result: ".queries[0].rows[0].id"
      as: "user_id"
Configuration
Required Fields
| Field | Description | Example | 
|---|---|---|
driver | 
Database driver | postgres, mysql, sqlite, sqlserver | 
dsn | 
Database connection string | postgres://user:pass@host:port/db | 
Optional Fields
| Field | Description | Example | 
|---|---|---|
commands | 
Array of SQL statements | ["SELECT * FROM users;"] | 
file | 
Path to SQL file | ./migrations/001_create.sql | 
timeout | 
Query execution timeout | 60s | 
Note: Must provide either commands or file, not both.
Assertions
Row Count
Validate number of rows returned by a query:
Query Count
Validate total number of queries executed:
Success Count
Validate number of successful queries:
Column Value
Validate specific column value:
Save Fields
Extract values from query results:
From Rows
save:
  - sql_result: ".queries[0].rows[0].id"
    as: "user_id"
  - sql_result: ".queries[0].rows[1].email"
    as: "user_email"
From Statistics
save:
  - sql_result: ".queries[0].rows_affected"
    as: "affected_count"
  - sql_result: ".stats.success_count"
    as: "successful_queries"
  - sql_result: ".stats.total_queries"
    as: "total_queries"
Common Patterns
CRUD Operations
steps:
  # Create
  - name: "Insert user"
    plugin: sql
    config:
      driver: postgres
      dsn: "{{ .env.DATABASE_URL }}"
      commands:
        - "INSERT INTO users (name, email) VALUES ('Test', 'test@example.com') RETURNING id;"
    save:
      - sql_result: ".queries[0].rows[0].id"
        as: "user_id"
  # Read
  - name: "Query user"
    plugin: sql
    config:
      driver: postgres
      dsn: "{{ .env.DATABASE_URL }}"
      commands:
        - "SELECT * FROM users WHERE id = {{ user_id }};"
    assertions:
      - type: row_count
        query_index: 0
        expected: 1
  # Update
  - name: "Update user"
    plugin: sql
    config:
      driver: postgres
      dsn: "{{ .env.DATABASE_URL }}"
      commands:
        - "UPDATE users SET active = false WHERE id = {{ user_id }};"
  # Delete
  - name: "Delete user"
    plugin: sql
    config:
      driver: postgres
      dsn: "{{ .env.DATABASE_URL }}"
      commands:
        - "DELETE FROM users WHERE id = {{ user_id }};"
Multiple Commands
Execute multiple SQL statements in one step:
- name: "Setup test data"
  plugin: sql
  config:
    driver: postgres
    dsn: "{{ .env.DATABASE_URL }}"
    commands:
      - "DELETE FROM test_users WHERE email LIKE '%@test.com';"
      - "INSERT INTO test_users (name, email) VALUES ('User 1', 'user1@test.com');"
      - "INSERT INTO test_users (name, email) VALUES ('User 2', 'user2@test.com');"
  assertions:
    - type: query_count
      expected: 3
    - type: success_count
      expected: 3
External SQL Files
Use external SQL files for complex queries or migrations:
- name: "Run migration"
  plugin: sql
  config:
    driver: postgres
    dsn: "{{ .env.DATABASE_URL }}"
    file: "./migrations/001_create_tables.sql"
    timeout: "60s"
Using Variables
vars:
  table_name: "users"
  min_age: 18
steps:
  - name: "Dynamic query"
    plugin: sql
    config:
      driver: postgres
      dsn: "{{ .env.DATABASE_URL }}"
      commands:
        - "SELECT * FROM {{ .vars.table_name }} WHERE age >= {{ .vars.min_age }};"
Local Development
Minikube Stack (Recommended)
scripts/install-minikube.sh
kubectl port-forward -n rocketship svc/rocketship-engine 7700:7700
rocketship run -af examples/sql-testing/rocketship.yaml
Docker Containers
Quick database setup for testing:
# PostgreSQL
docker run --rm -d \
  --name rocketship-postgres \
  -e POSTGRES_PASSWORD=testpass \
  -e POSTGRES_DB=testdb \
  -p 5433:5432 \
  postgres:13
# MySQL
docker run --rm -d \
  --name rocketship-mysql \
  -e MYSQL_ROOT_PASSWORD=testpass \
  -e MYSQL_DATABASE=testdb \
  -p 3306:3306 \
  mysql:8.0
# Cleanup
docker stop rocketship-postgres rocketship-mysql
Best Practices
- Security: Store DSN in environment variables, never commit credentials
 - Performance: Set appropriate timeouts for long queries
 - Isolation: Clean up test data in cleanup hooks
 - Assertions: Validate both success and error scenarios
 
See Also
- Variables - Using environment variables for credentials
 - Lifecycle Hooks - Setting up and tearing down databases