Skip to content

Commit 96d0549

Browse files
code-rootclaude
andcommitted
fix: replace db.refresh() with re-fetch after commit
AsyncSession objects become detached after commit(), so db.refresh() fails. Replace all refresh() calls with re-fetching the object using select() query after commit. Fixes net::ERR_CONNECTION_ABORTED error in upload endpoint. Affected endpoints: - POST /api/firmware/upload - POST /api/firmware/entries - PUT /api/firmware/entries/{id} Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
1 parent 9af2f6a commit 96d0549

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

backend/api/routes/firmware_route.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ async def upload_firmware_file(
202202
existing.size_bytes = len(data)
203203
existing.local_path = str(dest_path)
204204
await db.commit()
205-
await db.refresh(existing)
205+
# Re-fetch after commit to avoid detached instance error
206+
result = await db.execute(select(FirmwareEntry).where(FirmwareEntry.id == existing.id))
207+
existing = result.scalar_one_or_none()
206208
return FirmwareEntryResponse.from_orm(existing)
207209

208210
# Create new entry
@@ -219,7 +221,9 @@ async def upload_firmware_file(
219221
)
220222
db.add(entry)
221223
await db.commit()
222-
await db.refresh(entry)
224+
# Re-fetch after commit to avoid detached instance error
225+
result = await db.execute(select(FirmwareEntry).where(FirmwareEntry.filename == safe_name))
226+
entry = result.scalar_one_or_none()
223227

224228
return FirmwareEntryResponse.from_orm(entry)
225229

@@ -386,8 +390,15 @@ async def create_firmware_entry(
386390
)
387391
db.add(entry)
388392
await db.commit()
389-
await db.refresh(entry)
390-
return FirmwareEntryResponse.from_orm(entry)
393+
# Re-fetch after commit to get updated values
394+
result = await db.execute(
395+
select(FirmwareEntry).where(
396+
FirmwareEntry.device_model == req.device_model,
397+
FirmwareEntry.sales_code == req.sales_code,
398+
).order_by(FirmwareEntry.created_at.desc())
399+
)
400+
entry = result.scalars().first()
401+
return FirmwareEntryResponse.from_orm(entry) if entry else None
391402

392403

393404
@router.put("/entries/{entry_id}")
@@ -415,7 +426,9 @@ async def update_firmware_entry(
415426
setattr(entry, key, value)
416427

417428
await db.commit()
418-
await db.refresh(entry)
429+
# Re-fetch after commit
430+
result = await db.execute(select(FirmwareEntry).where(FirmwareEntry.id == entry_id))
431+
entry = result.scalar_one_or_none()
419432
return FirmwareEntryResponse.from_orm(entry)
420433

421434

0 commit comments

Comments
 (0)