实现方式 | Go ORM库 | star |
---|---|---|
reflect to struct | go-gorm/gorm | 36.6k |
reflect to struct | go-xorm/xorm | 6.7k |
reflect to struct | upper/db | 3.5k |
Code gen | go-gorm/gen | 2.3k |
Code gen | ent/ent | 15.9k |
Code gen | sqlc-dev/sqlc | 14.2k |
SQL enhance | Masterminds/squirrel | 7.1k |
SQL enhance | jmoiron/sqlx | 16.6k |
package main import ( "log" "gorm.io/driver/sqlite" "gorm.io/gorm" ) type User struct { gorm.Model Name string`gorm:"not null"` Email string`gorm:"unique;not null"` } func main() { db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) if err != nil { log.Fatal(err) } // 堆代码 duidaima.com // 创建记录 db.Create(&User{Name: "Alice", Email: "alice@example.com"}) // 查询记录 var user User db.First(&user, "name = ?", "Alice") log.Printf("User: %+v\n", user) }2、代码生成型
高运行时性能:无需依赖反射,运行时效率更高。
开发流程复杂:生成代码与手写代码之间的同步和维护可能增加开发难度,尤其在频繁修改 schema 时。
package main import ( "context" "log" "entgo.io/ent/dialect/sql" _ "github.com/mattn/go-sqlite3" "entgo.io/ent/examples/start/ent" ) func main() { client, err := ent.Open(sqlite.Open("./ent.db"), &sql.Config{Driver: "sqlite3"}) if err != nil { log.Fatal("failed to connect to the database:", err) } defer client.Close() // 创建一个新用户 user, err := client.User.Create(). SetName("Alice"). SetEmail("alice@example.com"). Save(context.Background()) if err != nil { log.Fatal(err) } log.Println("User created:", user) }3、SQL增强型库
轻量高效:直接使用原生 SQL,无额外 ORM 开销
package main import ( "log" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" ) type User struct { ID int `db:"id"` Name string`db:"name"` Email string`db:"email"` } func main() { db, err := sqlx.Connect("sqlite3", "sqlx.db") if err != nil { log.Fatal(err) } // 查询数据 var user User err = db.Get(&user, "SELECT * FROM users WHERE id=?", id) if err != nil { log.Fatal(err) } log.Printf("User: %+v\n", user) }三、总结
3.SQL增强型库(如 sqlx)在保留 SQL 灵活性的同时,通过扩展封装提升了开发效率,非常适合不喜欢ORM概念的开发者