Fix chain import to use correct delete syntax and preserve chain_id from imported data
Some checks failed
Integration Tests / test-service-integration (push) Has been cancelled
Python Tests / test-python (push) Has been cancelled
Security Scanning / security-scan (push) Has been cancelled

- Remove unused sqlalchemy.func import
- Replace select().delete() with delete() for proper SQLModel syntax in import_chain
- Add chain_id extraction from first block if not provided in import_data root
- Add chain_id field to Block creation during import to ensure consistency
- Remove redundant session.close() in export_chain finally block (session_scope handles cleanup)
This commit is contained in:
aitbc
2026-04-13 23:29:31 +02:00
parent d7fb2eae95
commit 60edf85047

View File

@@ -1,5 +1,4 @@
from __future__ import annotations
from sqlalchemy import func
import asyncio
import json
@@ -9,7 +8,7 @@ from datetime import datetime, timedelta
from fastapi import APIRouter, HTTPException, status
from pydantic import BaseModel, Field, model_validator
from sqlmodel import select
from sqlmodel import select, delete
from ..database import session_scope
from ..gossip import gossip_broker
@@ -739,8 +738,6 @@ async def export_chain(chain_id: str = None) -> Dict[str, Any]:
"export_data": export_data,
"export_size_bytes": len(json.dumps(export_data))
}
finally:
session.close()
except Exception as e:
_logger.error(f"Error exporting chain: {e}")
raise HTTPException(status_code=500, detail=f"Failed to export chain: {str(e)}")
@@ -754,6 +751,10 @@ async def import_chain(import_data: dict) -> Dict[str, Any]:
accounts = import_data.get("accounts", [])
transactions = import_data.get("transactions", [])
# If chain_id not in import_data, try to get it from first block
if not chain_id and blocks:
chain_id = blocks[0].get("chain_id")
with session_scope() as session:
# Validate import
if not blocks:
@@ -773,13 +774,14 @@ async def import_chain(import_data: dict) -> Dict[str, Any]:
_logger.info(f"Backing up existing chain with {existing_count} blocks")
# Clear existing data
session.execute(select(Block).delete())
session.execute(select(Account).delete())
session.execute(select(Transaction).delete())
session.execute(delete(Block))
session.execute(delete(Account))
session.execute(delete(Transaction))
# Import blocks
for block_data in blocks:
block = Block(
chain_id=chain_id,
height=block_data["height"],
hash=block_data["hash"],
parent_hash=block_data["parent_hash"],
@@ -793,6 +795,7 @@ async def import_chain(import_data: dict) -> Dict[str, Any]:
# Import accounts
for account_data in accounts:
account = Account(
chain_id=chain_id,
address=account_data["address"],
balance=account_data["balance"],
nonce=account_data["nonce"]