66 lines
1.8 KiB
Bash
Executable File
66 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# list SQLite schemas, tables, and columns (type, notnull, default, pk)
|
|
# Usage: ./database_schema_display.sh path/to/db.sqlite
|
|
|
|
set -euo pipefail
|
|
|
|
DB_PATH="${1:-}"
|
|
|
|
if [[ -z "$DB_PATH" ]]; then
|
|
echo "Usage: $0 path/to/database.sqlite" >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -f "$DB_PATH" ]]; then
|
|
echo "Error: Database file '$DB_PATH' does not exist." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== Schemas (databases) ==="
|
|
# Show as-is for human info
|
|
sqlite3 "$DB_PATH" ".databases" || true
|
|
echo ""
|
|
|
|
# Get schema names via PRAGMA (stable across sqlite versions)
|
|
schemas=$(sqlite3 -noheader -separator '|' "$DB_PATH" "PRAGMA database_list;" | awk -F'|' '{print $2}')
|
|
|
|
# Fallback if empty (very old sqlite): assume main
|
|
if [[ -z "$schemas" ]]; then
|
|
schemas="main"
|
|
fi
|
|
|
|
for schema in $schemas; do
|
|
echo "=== Schema: $schema ==="
|
|
|
|
# Get user tables (exclude internal sqlite_% tables)
|
|
tables=$(sqlite3 -noheader "$DB_PATH" \
|
|
"SELECT name
|
|
FROM \"$schema\".sqlite_schema
|
|
WHERE type='table' AND name NOT LIKE 'sqlite_%'
|
|
ORDER BY name;")
|
|
|
|
if [[ -z "$tables" ]]; then
|
|
echo " (no user tables)"
|
|
echo ""
|
|
continue
|
|
fi
|
|
|
|
# Iterate tables safely line-by-line
|
|
while IFS= read -r table; do
|
|
[[ -z "$table" ]] && continue
|
|
echo " -> Table: $table"
|
|
# Columns: cid|name|type|notnull|dflt_value|pk
|
|
sqlite3 -noheader -separator '|' "$DB_PATH" "PRAGMA \"$schema\".table_info('$table');" \
|
|
| awk -F'|' '
|
|
BEGIN {
|
|
printf " %-28s %-16s %-8s %-16s %-3s\n", "Column", "Type", "NotNull", "Default", "PK"
|
|
printf " %-28s %-16s %-8s %-16s %-3s\n", "------", "----", "-------", "-------", "--"
|
|
}
|
|
{
|
|
dv = ($5 == "" ? "NULL" : $5)
|
|
printf " %-28s %-16s %-8s %-16s %-3s\n", $2, $3, $4, dv, $6
|
|
}
|
|
'
|
|
echo ""
|
|
done <<< "$tables"
|
|
done
|