Database Linting
The database linter analyzes your live Postgres database schema to detect performance issues, security vulnerabilities, and configuration problems. Unlike the file-based linter which checks SQL migration files, the database linter connects directly to your database and inspects the actual schema state.
All database linting rules are powered by existing tools such as Splinter.
Rules
See the Database Linter Rules Reference for the complete list of available rules and their descriptions.
Configuration
Configure database linting behavior in your postgres-language-server.jsonc:
{
"splinter": {
// Enable/disable the database linter entirely
"enabled": true,
"rules": {
// Configure rule groups
"performance": {
// Individual rule configuration
"noPrimaryKey": "warn",
"unusedIndex": "info"
},
"security": {
"rlsDisabledInPublic": "error",
"authUsersExposed": "error"
}
}
}
}
Ignoring Database Objects
You can ignore specific database objects using glob patterns. Patterns use Unix-style globs where * matches any sequence of characters. Patterns should be in the format schema.object_name.
Global Ignore
To ignore objects across all rules, use the top-level ignore field:
{
"splinter": {
"ignore": [
"audit.*",
"temp_*"
],
"rules": {
// ...
}
}
}
This is useful for excluding entire schemas (like audit logs or temporary tables) from all database linting.
Per-Rule Ignore
To ignore objects for a specific rule only, use the rule-level ignore option:
{
"splinter": {
"rules": {
"performance": {
"noPrimaryKey": {
"level": "warn",
"options": {
"ignore": [
"public.temp_*",
"staging.*"
]
}
}
}
}
}
}
Pattern Examples
| Pattern | Matches |
|---|---|
public.my_table |
Specific table in public schema |
audit.* |
All objects in the audit schema |
*.temp_* |
Objects with temp_ prefix in any schema |
public.log_* |
Tables starting with log_ in public schema |
Supabase-Specific Rules
Some rules are specifically designed for Supabase projects and will be automatically skipped if Supabase-specific database roles are not detected. These rules check for issues related to:
- Auth schema exposure
- RLS policy configuration
- API schema security
- Supabase-specific extensions
CLI Usage
The database linter can be run via the CLI:
# Run database linting
postgres-language-server dblint
# With specific rules
postgres-language-server dblint --only security/rlsDisabledInPublic
# Skip certain rules
postgres-language-server dblint --skip performance/tableBloat
See the CLI Reference for more options.
Database Connection
The database linter requires a database connection to analyze the schema. Configure your connection in postgres-language-server.jsonc:
{
"db": {
"host": "127.0.0.1",
"port": 5432,
"database": "postgres",
"username": "postgres",
"password": "postgres"
}
}
See the database connection guide for more details.