```
chore: enhance .gitignore and remove obsolete documentation files - Reorganize .gitignore with categorized sections for better maintainability - Add comprehensive ignore patterns for Python, Node.js, databases, logs, and build artifacts - Add project-specific ignore rules for coordinator, explorer, and deployment files - Remove outdated documentation: BITCOIN-WALLET-SETUP.md, LOCAL_ASSETS_SUMMARY.md, README-CONTAINER-DEPLOYMENT.md, README-DOMAIN-DEPLOYMENT.md ```
This commit is contained in:
103
apps/coordinator-api/scripts/migrate_complete.py
Normal file
103
apps/coordinator-api/scripts/migrate_complete.py
Normal file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Complete migration script for Coordinator API"""
|
||||
|
||||
import sqlite3
|
||||
import psycopg2
|
||||
from psycopg2.extras import RealDictCursor
|
||||
import json
|
||||
from decimal import Decimal
|
||||
|
||||
# Database configurations
|
||||
SQLITE_DB = "coordinator.db"
|
||||
PG_CONFIG = {
|
||||
"host": "localhost",
|
||||
"database": "aitbc_coordinator",
|
||||
"user": "aitbc_user",
|
||||
"password": "aitbc_password",
|
||||
"port": 5432
|
||||
}
|
||||
|
||||
def migrate_all_data():
|
||||
"""Migrate all data from SQLite to PostgreSQL"""
|
||||
|
||||
print("\nStarting complete data migration...")
|
||||
|
||||
# Connect to SQLite
|
||||
sqlite_conn = sqlite3.connect(SQLITE_DB)
|
||||
sqlite_conn.row_factory = sqlite3.Row
|
||||
sqlite_cursor = sqlite_conn.cursor()
|
||||
|
||||
# Connect to PostgreSQL
|
||||
pg_conn = psycopg2.connect(**PG_CONFIG)
|
||||
pg_cursor = pg_conn.cursor()
|
||||
|
||||
# Get all tables
|
||||
sqlite_cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
||||
tables = [row[0] for row in sqlite_cursor.fetchall()]
|
||||
|
||||
for table_name in tables:
|
||||
if table_name == 'sqlite_sequence':
|
||||
continue
|
||||
|
||||
print(f"\nMigrating {table_name}...")
|
||||
|
||||
# Get table schema
|
||||
sqlite_cursor.execute(f"PRAGMA table_info({table_name})")
|
||||
columns = sqlite_cursor.fetchall()
|
||||
column_names = [col[1] for col in columns]
|
||||
|
||||
# Get data
|
||||
sqlite_cursor.execute(f"SELECT * FROM {table_name}")
|
||||
rows = sqlite_cursor.fetchall()
|
||||
|
||||
if not rows:
|
||||
print(f" No data in {table_name}")
|
||||
continue
|
||||
|
||||
# Build insert query
|
||||
if table_name == 'user':
|
||||
insert_sql = f'''
|
||||
INSERT INTO "{table_name}" ({', '.join(column_names)})
|
||||
VALUES ({', '.join(['%s'] * len(column_names))})
|
||||
'''
|
||||
else:
|
||||
insert_sql = f'''
|
||||
INSERT INTO {table_name} ({', '.join(column_names)})
|
||||
VALUES ({', '.join(['%s'] * len(column_names))})
|
||||
'''
|
||||
|
||||
# Insert data
|
||||
count = 0
|
||||
for row in rows:
|
||||
values = []
|
||||
for i, value in enumerate(row):
|
||||
col_name = column_names[i]
|
||||
# Handle special cases
|
||||
if col_name in ['payload', 'constraints', 'result', 'receipt', 'capabilities',
|
||||
'extra_metadata', 'sla', 'attributes', 'metadata'] and value:
|
||||
if isinstance(value, str):
|
||||
try:
|
||||
value = json.loads(value)
|
||||
except:
|
||||
pass
|
||||
elif col_name in ['balance', 'price', 'average_job_duration_ms'] and value is not None:
|
||||
value = Decimal(str(value))
|
||||
values.append(value)
|
||||
|
||||
try:
|
||||
pg_cursor.execute(insert_sql, values)
|
||||
count += 1
|
||||
except Exception as e:
|
||||
print(f" Error inserting row: {e}")
|
||||
print(f" Values: {values}")
|
||||
|
||||
print(f" Migrated {count} rows from {table_name}")
|
||||
|
||||
pg_conn.commit()
|
||||
sqlite_conn.close()
|
||||
pg_conn.close()
|
||||
|
||||
print("\n✅ Complete migration finished!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
migrate_all_data()
|
||||
Reference in New Issue
Block a user