128 lines
2.8 KiB
Go
128 lines
2.8 KiB
Go
package benchmarks
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"log"
|
|
"time"
|
|
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"github.com/jmoiron/sqlx"
|
|
sqlc "github.com/rexfordnyrk/go-db-comparison/benchmarks/sqlc_generated"
|
|
)
|
|
|
|
func init() {
|
|
var err error
|
|
// Opening a database connection.
|
|
db, err = sql.Open("mysql", "theuser:thepass@tcp(localhost:3306)/thedb?multiStatements=true&parseTime=true")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
//sqlx connection using existing db connection
|
|
dbx = sqlx.NewDb(db, "mysql")
|
|
|
|
//sqlc connection using existing db connection
|
|
dbc = sqlc.New(db)
|
|
|
|
//gorm connection using existing db connection
|
|
gdb, err = gorm.Open(mysql.New(mysql.Config{Conn: db}))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
var (
|
|
gdb *gorm.DB
|
|
db *sql.DB
|
|
dbx *sqlx.DB
|
|
dbc *sqlc.Queries
|
|
)
|
|
|
|
func setup() {
|
|
clear()
|
|
table := `CREATE TABLE students (
|
|
id bigint NOT NULL AUTO_INCREMENT,
|
|
fname varchar(50) not null,
|
|
lname varchar(50) not null,
|
|
date_of_birth datetime not null,
|
|
email varchar(50) not null,
|
|
address varchar(50) not null,
|
|
gender varchar(50) not null,
|
|
PRIMARY KEY (id)
|
|
);`
|
|
_, err := db.Exec(table)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
//inserting records
|
|
_, err = db.Exec(records)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func clear() {
|
|
_, err := db.Exec(`DROP TABLE IF EXISTS students;`)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
type Student struct {
|
|
ID int64
|
|
Fname string
|
|
Lname string
|
|
DateOfBirth time.Time `db:"date_of_birth"`
|
|
Email string
|
|
Address string
|
|
Gender string
|
|
}
|
|
|
|
func DbSqlQueryStudentWithLimit(limit int) {
|
|
var students []Student
|
|
rows, err := db.Query("SELECT * FROM students limit ?", limit)
|
|
if err != nil {
|
|
log.Fatalf("DbSqlQueryStudentWithLimit %d %v", limit, err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
// Loop through rows, using Scan to assign column data to struct fields.
|
|
for rows.Next() {
|
|
var s Student
|
|
if err := rows.Scan(&s.ID, &s.Fname, &s.Lname, &s.DateOfBirth, &s.Email, &s.Address, &s.Gender); err != nil {
|
|
log.Fatalf("DbSqlQueryStudentWithLimit %d %v", limit, err)
|
|
}
|
|
students = append(students, s)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
log.Fatalf("DbSqlQueryStudentWithLimit %d %v", limit, err)
|
|
}
|
|
}
|
|
|
|
func SqlxQueryStudentWithLimit(limit int) {
|
|
var students []Student
|
|
err := dbx.Select(&students, "SELECT * FROM students LIMIT ?", limit)
|
|
if err != nil {
|
|
log.Fatalf("SqlxQueryStudentWithLimit %d %v", limit, err)
|
|
}
|
|
}
|
|
|
|
func SqlcQueryStudentWithLimit(limit int) {
|
|
_, err := dbc.FetchStudents(context.Background(), int32(limit))
|
|
if err != nil {
|
|
log.Fatalf("SqlcQueryStudentWithLimit %d %v", limit, err)
|
|
}
|
|
}
|
|
|
|
func GormQueryStudentWithLimit(limit int) {
|
|
var students []Student
|
|
if err := gdb.Limit(limit).Find(&students).Error; err != nil {
|
|
log.Fatalf("GormQueryStudentWithLimit %d %v", limit, err)
|
|
}
|
|
}
|