Как мне сделать это, не добавляя его вручную в каждое место, где я использую sql.Exec?
Обернуть ваш объект доступа SQL.Например:
type MyDB struct {
*sql.DB
count int
}
func (db *MyDB) Exec(query string, args ...interface{}) (sql.Result,error) {
db.count++
return db.DB.Exec(query, args...)
}
Тогда везде используйте ваш упакованный тип.Это (вероятно) будет означать обновление большого количества кода для использования интерфейса, а не переменной *sql.DB
.
Единственным другим вариантом является написание оболочки вокруг драйвера SQL (а не клиента).Но вы бы использовали тот же подход.Этот метод требует более глубокого понимания внутренних элементов Go * sql
.