Datastar_Meetup/material/sqlite/countries_import.sh
2025-11-11 06:33:53 +01:00

86 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
# Script to import REST Countries JSON data into SQLite
# Usage: ./import_countries.sh countries.json
JSON_FILE="${1:-countries.json}"
DB_FILE="countries.db"
# Check if JSON file exists
if [ ! -f "$JSON_FILE" ]; then
echo "Error: $JSON_FILE not found!"
echo "Usage: $0 <path-to-countries.json>"
exit 1
fi
echo "Creating SQLite database: $DB_FILE"
# Remove existing database if present
rm -f "$DB_FILE"
# Create database and import JSON
sqlite3 "$DB_FILE" << 'EOF'
-- Create table with JSON column
CREATE TABLE countries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
data JSON NOT NULL
);
-- Enable JSON mode for import
.mode json
-- Read and insert JSON data
.import countries.json countries_temp
-- The import creates a temporary table, now we need to move data
-- Since the JSON file is an array, we need to handle it properly
EOF
# Alternative approach: Use jq to process JSON array and insert row by row
echo "Processing JSON data..."
sqlite3 "$DB_FILE" << 'EOF'
-- If direct import doesn't work, we'll insert via stdin
CREATE TABLE IF NOT EXISTS countries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
data JSON NOT NULL
);
EOF
# Use jq to split array into individual objects and insert
jq -c '.[]' "$JSON_FILE" | while IFS= read -r country; do
sqlite3 "$DB_FILE" "INSERT INTO countries (data) VALUES (json('$country'));"
done
echo "Import complete!"
echo "Database created: $DB_FILE"
echo ""
echo "Running sample queries..."
echo ""
# Sample queries
sqlite3 -column -header "$DB_FILE" << 'EOF'
-- Count total countries
SELECT COUNT(*) as total_countries FROM countries;
-- Get countries with German names, population, and timezones
SELECT
json_extract(data, '$.name.common') as country_name,
json_extract(data, '$.name.nativeName.deu.official') as german_name,
json_extract(data, '$.population') as population,
json_extract(data, '$.timezones') as timezones
FROM countries
WHERE json_extract(data, '$.name.nativeName.deu.official') IS NOT NULL
LIMIT 10;
-- Get all German translations (from translations field)
SELECT
json_extract(data, '$.name.common') as country_name,
json_extract(data, '$.translations.deu.official') as german_official,
json_extract(data, '$.translations.deu.common') as german_common
FROM countries
LIMIT 10;
EOF
echo ""
echo "Database ready! You can now query with: sqlite3 $DB_FILE"