go resource_error ai_generated true

sql: 行已关闭

sql: Rows are closed

ID: go/database-sql-rows-close-error

其他格式: JSON · Markdown 中文 · English
78%修复率
82%置信度
1证据数
2023-11-20首次发现

版本兼容性

版本状态引入弃用备注
go1.21 active
go1.22 active

根因分析

在 *sql.Rows 对象被显式关闭或所有行已耗尽但未正确迭代后,调用 Scan 或 Next。

English

Calling Scan or Next on a *sql.Rows object after it has been explicitly closed or after all rows have been exhausted without proper iteration.

generic

官方文档

https://pkg.go.dev/database/sql#Rows

解决方案

  1. 确保 rows.Next() 循环完整执行后再访问行:for rows.Next() { ... }; if err := rows.Err(); err != nil { ... }
  2. 避免在迭代完成前调用 rows.Close();让 defer 在循环后处理。

无效尝试

常见但无效的做法:

  1. Adding defer rows.Close() after checking error but before iterating 70% 失败

    Deferring close doesn't prevent premature closure; the error occurs after rows are exhausted, not from missing close.

  2. Calling rows.Close() multiple times 45% 失败

    Closing an already closed rows object is safe in Go, but doesn't fix the premature access; the root cause is logic error.