首页 > 其他分享 >go-orm接口原生到框架

go-orm接口原生到框架

时间:2024-09-18 16:21:56浏览次数:3  
标签:原生 log err models orm user go Fatal

go-orm接口原生到框架

1. 使用 Go 原生数据库 API 连接 MySQL

示例项目结构
myapp/
├── main.go
├── models/
│   └── user.go
└── go.mod
go.mod
module myapp

go 1.20

require (
    github.com/go-sql-driver/mysql v1.6.0
)
main.go
package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 数据库连接字符串
    dsn := "user:password@tcp(127.0.0.1:3306)/mydb"
    
    // 连接数据库
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 测试数据库连接
    if err := db.Ping(); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Connected to the database successfully!")

    // 创建表
    createTable := `CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        email VARCHAR(100) NOT NULL UNIQUE
    );`
    _, err = db.Exec(createTable)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Table created successfully!")

    // 插入数据
    _, err = db.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "John Doe", "[email protected]")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Data inserted successfully!")

    // 查询数据
    rows, err := db.Query("SELECT id, name, email FROM users")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name, email string
        if err := rows.Scan(&id, &name, &email); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%d: %s - %s\n", id, name, email)
    }

    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
}

2.使用 SQLX 库连接 MySQL

sqlx 是一个 Go 语言的库,它在 database/sql 基础上扩展了更多功能,提供了更简洁的接口用于处理 SQL 查询和数据映射。以下是一个使用 sqlx 连接和操作 MySQL 数据库的示例。

sqlx 示例项目结构
myapp/
├── main.go
├── models/
│   └── user.go
└── go.mod
go.mod
module myapp

go 1.20

require (
    github.com/go-sql-driver/mysql v1.6.0
    github.com/jmoiron/sqlx v1.4.0
)
models/user.go
package models

// User 定义了 User 结构体
type User struct {
    ID    int64  `db:"id"`
    Name  string `db:"name"`
    Email string `db:"email"`
}
main.go
package main

import (
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
    "myapp/models"
)

func main() {
    // 数据库连接字符串
    dsn := "user:password@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
    
    // 连接数据库
    db, err := sqlx.Open("mysql", dsn)
    if err != nil {
        log.Fatal("failed to connect database:", err)
    }
    defer db.Close()

    fmt.Println("Connected to the database successfully!")

    // 创建表
    schema := `
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        email VARCHAR(100) NOT NULL UNIQUE
    );`
    _, err = db.Exec(schema)
    if err != nil {
        log.Fatal("failed to create table:", err)
    }

    fmt.Println("Table created successfully!")

    // 插入数据
    user := models.User{Name: "John Doe", Email: "[email protected]"}
    _, err = db.NamedExec(`INSERT INTO users (name, email) VALUES (:name, :email)`, &user)
    if err != nil {
        log.Fatal("failed to insert data:", err)
    }

    fmt.Println("Data inserted successfully!")

    // 查询数据
    var users []models.User
    err = db.Select(&users, "SELECT id, name, email FROM users")
    if err != nil {
        log.Fatal("failed to query data:", err)
    }

    for _, user := range users {
        fmt.Printf("%d: %s - %s\n", user.ID, user.Name, user.Email)
    }
}

3. 使用 XORM 框架连接 MySQL

示例项目结构
myapp/
├── main.go
├── models/
│   └── user.go
└── go.mod
go.mod
module myapp

go 1.20

require (
    github.com/go-sql-driver/mysql v1.6.0
    xorm.io/xorm v0.7.1
)
models/user.go
package models

type User struct {
    Id    int64  `xorm:"pk autoincr"`
    Name  string `xorm:"not null"`
    Email string `xorm:"unique not null"`
}
main.go
package main

import (
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
    "xorm.io/xorm"
    "myapp/models"
)

func main() {
    // 数据库连接字符串
    dsn := "user:password@tcp(127.0.0.1:3306)/mydb"
    
    // 连接数据库
    engine, err := xorm.NewEngine("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer engine.Close()

    // 自动同步结构
    if err := engine.Sync2(new(models.User)); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Table created successfully!")

    // 插入数据
    user := &models.User{Name: "John Doe", Email: "[email protected]"}
    _, err = engine.Insert(user)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Data inserted successfully!")

    // 查询数据
    var users []models.User
    if err := engine.Find(&users); err != nil {
        log.Fatal(err)
    }

    for _, user := range users {
        fmt.Printf("%d: %s - %s\n", user.Id, user.Name, user.Email)
    }
}

4.使用 GORM 框架连接 MySQL

以下是一个使用 GORM 框架连接和操作 MySQL 数据库的示例。GORM 是一个流行的 Go 语言 ORM 框架,可以简化与数据库的交互。

GORM 示例项目结构
myapp/
├── main.go
├── models/
│   └── user.go
└── go.mod
go.mod
module myapp

go 1.20

require (
    github.com/go-sql-driver/mysql v1.6.0
    gorm.io/gorm v1.24.0
    gorm.io/driver/mysql v1.5.0
)
models/user.go
package models

import (
    "gorm.io/gorm"
)

type User struct {
    gorm.Model
    Name  string `gorm:"not null"`
    Email string `gorm:"unique;not null"`
}
main.go
package main

import (
    "fmt"
    "log"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "myapp/models"
)

func main() {
    // 数据库连接字符串
    dsn := "user:password@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
    
    // 连接数据库
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("failed to connect database:", err)
    }

    fmt.Println("Connected to the database successfully!")

    // 自动迁移
    if err := db.AutoMigrate(&models.User{}); err != nil {
        log.Fatal("failed to migrate database:", err)
    }

    fmt.Println("Table created successfully!")

    // 插入数据
    user := models.User{Name: "John Doe", Email: "[email protected]"}
    if err := db.Create(&user).Error; err != nil {
        log.Fatal("failed to insert data:", err)
    }

    fmt.Println("Data inserted successfully!")

    // 查询数据
    var users []models.User
    if err := db.Find(&users).Error; err != nil {
        log.Fatal("failed to query data:", err)
    }

    for _, user := range users {
        fmt.Printf("%d: %s - %s\n", user.ID, user.Name, user.Email)
    }
}

标签:原生,log,err,models,orm,user,go,Fatal
From: https://blog.csdn.net/weixin_52236586/article/details/142333483

相关文章

  • Borland license information was found, but it is not valid for Delphi.
    Delphi错误:Borlandlicenseinformationwasfound,butitisnotvalidforDelphi.YoucannotrunDelphiwithoutthisinformation.Clickthe'Exit'buttontoexitDelphi.Delphi错误:Borlandlicenseinformationwasfound,butitisnotvalidforDel......
  • Transformer从入门到精通的实战指南看这本书就够了—《Transformers in Action》(附PDF
    前言TransformersinAction将革命性的Transformers架构添加到您的AI工具包中。您将深入了解模型架构的基本细节,通过易于理解的示例和巧妙的类比解释所有复杂的概念-从袜子分类到滑雪!即使是复杂的基础概念也从实际应用开始,因此您永远不必为抽象理论而苦恼。这本书包括一个广......
  • 31. 下一个排列 Golang实现
    题目描述:整数数组的一个排列就是将其所有成员以序列或线性顺序排列。例如,arr=[1,2,3],以下这些都可以视作arr的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到......
  • MongoDB增加身份验证
    1.数据库添加用户和密码mongo>useadmin>db.createUser({user:"nucRoot",pwd:"f71F!6",roles:["root"]}) 2.修改启动文件,通过auth方式启动,完整如下(INI格式)dbpath=/usr/local/mongodb/data/dblogpath=/usr/local/mongodb/data/logs/mongodb.loglogap......
  • Golang代码导致cpu高的原因你知道吗????
    这段代码中出现高CPU使用率的原因主要是由于忙轮询(busy-waiting)问题。让我们仔细分析下这个问题:代码分析go复制代码select{casev:=<-ch://从通道接收到值vdefault://无数据可接收,走到default分支}casev:=<-ch:尝试从通道ch中接收数据。如果通道中有数......
  • Go 框架 Gin使用 validator 若干实用技巧
    Go框架Gin使用validator若干实用技巧网管叨bi叨  2024年09月17日10:39 北京 以下文章来源于李文周 ,作者李文周李文周.一个北漂程序员的自我更新之旅。在web开发中一个不可避免的环节就是对请求参数进行校验,通常我们会在代码中定义与请求参数相对应的......
  • 云原生周刊:Prometheus 3.0 Beta 发布|2024.09.16
    开源项目推荐KumaKuma是一个现代化的基于Envoy的服务网格,能够在每个云平台上运行,支持单区域或多区域部署,兼容Kubernetes和虚拟机。凭借其广泛的通用工作负载支持,以及对Envoy数据平面代理技术的原生支持(但无需Envoy专业知识),Kuma提供了现代化的L4-L7服务连接、发现、......
  • GO语言学习笔记之mac环境go语言配置
    此处仅为Mac的Iterm终端,关于go的环境配置,仅供参考cd~vim.zshrcGOROOT为go的安装路径,GOPATH为go安装额外的工具和具体的工具环境配置,GOPROXY将安装镜像源改为阿里云#goexportGOROOT="/usr/local/go"exportGOPATH="/Users/635458/go"exportPATH=$PATH:$GOROOT/bin:$GOPATH......
  • 高效数据移动指南 | 如何快速实现数据库 MySQL 到 MongoDB 的数据同步?
    在现代企业中,数据无处不在,贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同,还是实时应用的数据同步,数据的一致性和及时性都至关重要。在数字化转型的过程中,如何确保不同系统、地域、设备之间的数据同步,成为了企业面临的重要挑战。本专题将基于实践经验,从......
  • 2024年JCR一区极光优化算法+分解对比!VMD-PLO-Transformer-BiLSTM多变量时间序列光伏功
    中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测目录中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料效果一览......