DDL updates: - Update extensions and schemas configuration - Add sessions table for auth schema - Update education schema (videos, install/uninstall scripts) - Add backtest_runs and llm_signals tables for ML schema Scripts: - Update database creation and migration scripts - Add DDL validation script New: - Add migrations directory structure - Add production seeds for auth, investment, market_data, trading Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
89 lines
2.4 KiB
Bash
Executable File
89 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# Direct MySQL to PostgreSQL migration script
|
|
# Uses mysqldump and psql for direct data transfer
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
MYSQL_HOST="72.60.226.4"
|
|
MYSQL_PORT="3306"
|
|
MYSQL_USER="root"
|
|
MYSQL_PASS="AfcItz2391,."
|
|
MYSQL_DB="db_trading_meta"
|
|
|
|
PG_HOST="localhost"
|
|
PG_PORT="5432"
|
|
PG_USER="trading_user"
|
|
PG_PASS="trading_dev_2025"
|
|
PG_DB="trading_data"
|
|
|
|
# Ticker mapping: MySQL symbol -> (PG symbol, ticker_id)
|
|
declare -A TICKER_MAP=(
|
|
["X:BTCUSD"]="1"
|
|
["C:EURUSD"]="2"
|
|
["C:GBPUSD"]="3"
|
|
["C:USDJPY"]="4"
|
|
["C:USDCAD"]="5"
|
|
["C:AUDUSD"]="6"
|
|
["C:NZDUSD"]="7"
|
|
["C:EURGBP"]="8"
|
|
["C:EURAUD"]="9"
|
|
["C:EURCHF"]="10"
|
|
["C:GBPJPY"]="11"
|
|
["C:GBPAUD"]="12"
|
|
["C:GBPCAD"]="13"
|
|
["C:GBPNZD"]="14"
|
|
["C:AUDCAD"]="15"
|
|
["C:AUDCHF"]="16"
|
|
["C:AUDNZD"]="17"
|
|
["C:XAUUSD"]="18"
|
|
)
|
|
|
|
migrate_ticker() {
|
|
local mysql_ticker=$1
|
|
local pg_ticker_id=$2
|
|
|
|
echo "Migrating $mysql_ticker (ticker_id=$pg_ticker_id)..."
|
|
|
|
# Export from MySQL and import to PostgreSQL
|
|
mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p"$MYSQL_PASS" $MYSQL_DB \
|
|
-N -e "SELECT $pg_ticker_id, date_agg, open, high, low, close, volume, vwap, ts FROM tickers_agg_data WHERE ticker='$mysql_ticker' ORDER BY date_agg" \
|
|
| PGPASSWORD=$PG_PASS psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DB \
|
|
-c "COPY market_data.ohlcv_5m (ticker_id, timestamp, open, high, low, close, volume, vwap, ts_epoch) FROM STDIN WITH (FORMAT csv, DELIMITER E'\t')"
|
|
|
|
echo "Completed $mysql_ticker"
|
|
}
|
|
|
|
# Main
|
|
echo "Starting migration..."
|
|
echo "MySQL: $MYSQL_HOST:$MYSQL_PORT/$MYSQL_DB"
|
|
echo "PostgreSQL: $PG_HOST:$PG_PORT/$PG_DB"
|
|
echo ""
|
|
|
|
# Migrate specific ticker or all
|
|
if [ -n "$1" ]; then
|
|
# Migrate specific ticker
|
|
mysql_ticker=$1
|
|
pg_ticker_id=${TICKER_MAP[$mysql_ticker]}
|
|
if [ -z "$pg_ticker_id" ]; then
|
|
echo "Unknown ticker: $mysql_ticker"
|
|
exit 1
|
|
fi
|
|
migrate_ticker "$mysql_ticker" "$pg_ticker_id"
|
|
else
|
|
# Migrate all tickers
|
|
for mysql_ticker in "${!TICKER_MAP[@]}"; do
|
|
pg_ticker_id=${TICKER_MAP[$mysql_ticker]}
|
|
migrate_ticker "$mysql_ticker" "$pg_ticker_id"
|
|
done
|
|
fi
|
|
|
|
echo ""
|
|
echo "Migration complete!"
|
|
|
|
# Verify counts
|
|
echo ""
|
|
echo "Verification:"
|
|
PGPASSWORD=$PG_PASS psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DB \
|
|
-c "SELECT t.symbol, COUNT(*) as rows FROM market_data.ohlcv_5m o JOIN market_data.tickers t ON t.id = o.ticker_id GROUP BY t.symbol ORDER BY t.symbol"
|