A low-code intrusion library that provides SQL tracing capabilities, suitable for any relational database (Sqlite3, MySQL, Oracle, SQL Server, PostgreSQL, TiDB, TDengine, etc.) and ORM libraries for various relational database (gorm, xorm, sqlx, etc.)
Unstable, use with caution in production environment
go get -u github.com/chenquan/sqltracepackage main
import (
"context""database/sql""fmt""github.com/chenquan/sqltrace""github.com/mattn/go-sqlite3"
_ "github.com/mattn/go-sqlite3""go.opentelemetry.io/otel""go.opentelemetry.io/otel/trace"
)
funcmain() {
// Create a sqlite3 driver with link trackingdriver:=sqltrace.NewDriver(sqltrace.Config{
Name: "sqlite3_trace",
DataSourceName: "sqlite3",
Endpoint: "http://localhost:14268/api/traces",
Sampler: 1,
Batcher: "jaeger",
}, &sqlite3.SQLiteDriver{})
defersqltrace.StopAgent()
// register new driversql.Register("sqlite3_trace", driver)
// open databasedb, err:=sql.Open("sqlite3_trace", "identifier.sqlite")
iferr!=nil {
panic(err)
}
tracer:=otel.GetTracerProvider().Tracer("sqlite3_trace")
ctx, span:=tracer.Start(context.Background(),
"test",
trace.WithSpanKind(trace.SpanKindClient),
)
deferspan.End()
db.ExecContext(ctx, `CREATE TABLE t( age integer, name TEXT)`)
db.ExecContext(ctx, "insert into t values (?,?)", 1, "chenquan")
// transactiontx, err:=db.BeginTx(ctx, nil)
stmt, err:=tx.PrepareContext(ctx, "select age+1 as age,name from t where age = ?;")
stmt.QueryContext(ctx, 1)
tx.Commit()
rows, err:=db.QueryContext(ctx, "select age+1 as age,name from t;")
forrows.Next() {
varageintvarnamestringerr:=rows.Scan(&age, &name)
iferr!=nil {
fmt.Println(err)
}
fmt.Println(age, name)
}
}package main
import (
"context""database/sql""fmt""github.com/chenquan/sqltrace""github.com/mattn/go-sqlite3""go.opentelemetry.io/otel""go.opentelemetry.io/otel/trace""gorm.io/driver/sqlite""gorm.io/gorm"
)
funcmain() {
// Create a sqlite3 driver with link trackingdriver:=sqltrace.NewDriver(sqltrace.Config{
DataSourceName: "sqlite3",
}, &sqlite3.SQLiteDriver{})
defersqltrace.StopAgent()
// register new driversql.Register("sqlite3_trace", driver)
db, err:=gorm.Open(sqlite.Dialector{
DriverName: "sqlite3_trace",
DSN: "identifier.sqlite",
}, &gorm.Config{})
iferr!=nil {
panic(err)
}
tracer:=otel.GetTracerProvider().Tracer("sqlite3_trace")
ctx, span:=tracer.Start(context.Background(),
"test",
trace.WithSpanKind(trace.SpanKindClient),
)
deferspan.End()
typeTstruct {
Ageint`db:"age"`Namestring`db:"name"`
}
db=db.WithContext(ctx)
db.Migrator().AutoMigrate(&T{})
db.Create(&T{
Age: 1,
Name: "chenquan",
})
rows, err:=db.Raw("select age+1 as age,name from ts;").Rows()
iferr!=nil {
panic(err)
}
forrows.Next() {
varageintvarnamestringerr:=rows.Scan(&age, &name)
iferr!=nil {
fmt.Println(err)
}
fmt.Println(age, name)
}
db.Commit()
}
If you like or are using this project to learn or start your solution, please give it a star⭐. Thanks!
- sqlbreaker: A low-code intrusion library that provides SQL breaker capabilities, suitable for any relational database (Sqlite3, MySQL, Oracle, SQL Server, PostgreSQL, TiDB, TDengine, etc.) and ORM libraries for various relational database (gorm, xorm, sqlx, etc.)
- sqlplus: A sql enhancement tool library based on
database/sql/driver

