golang mysql null_golang处理数据库null数据

在用golang获取数据库的数据的时候,难免会遇到可控field。这个时候拿到的数据如果直接用`string`, `time.Time`这样的类型来解析的话会遇到panic。

那么如何处理这个问题呢,第一个出现在眼前的办法就是用`database/sql`。这个包里包含了很多的可以处理可控字段的类型,比如:`sql.NullString`, `sql.NullBool`等。所以,model可以用这些类型来定义,如:

```go

package main

import (

"database/sql"

"fmt"

)

type Article struct {

Id int `json:"id"`

Title string `json:"title"`

PubDate mysql.NullTime `json:"pub_date"`

Body sql.NullString `json:"body"`

User sql.NullInt64 `json:"user"`

}

```

这样的定义是可以work的,但是会有一点奇怪:没谁会用数据库的类型来代替平时的类型。所以,我们可以改一种思路。在解析数据库的时候会有专用的数据库类型字段来接收,但是在返回json的时候有专门的model来使用,这个model用的是普通的类型。

所以,写起来是这样的:

```go

var person Person

var personID int64

var password sql.NullString

var lastLogin mysql.NullTime

var isSuperuser sql.NullBool

var userName sql.NullString

var firstName sql.NullString

var lastName sql.NullString

var email sql.NullString

var isStaff sql.NullBool

var isActive sql.NullBool

var dateJoined mysql.NullTime

err = ret.Scan(

&personID,

&password,

&lastLogin,

&isSuperuser,

&userName,

&firstName,

&lastName,

&a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 MySQL 数据库实现的客户管理系统的 Go 语言代码示例: 首先需要安装 MySQL 驱动,可以使用以下命令来安装: ``` go get -u github.com/go-sql-driver/mysql ``` 然后创建一个名为 `customers` 的数据库,以及一个名为 `customer` 的表,表结构如下: ``` CREATE TABLE `customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email` varchar(255) DEFAULT NULL, `phone` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 接下来是 Go 代码: ```go package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) type Customer struct { id int name string email string phone string } var db *sql.DB func main() { // 连接数据库 var err error db, err = sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/customers") if err != nil { fmt.Println(err) return } defer db.Close() for { fmt.Println("Welcome to the Customer Management System!") fmt.Println("----------------------------------------") fmt.Println("1. Add Customer") fmt.Println("2. View Customers") fmt.Println("3. Exit") fmt.Println("----------------------------------------") var choice int fmt.Print("Enter your choice: ") fmt.Scanln(&choice) switch choice { case 1: addCustomer() case 2: viewCustomers() case 3: fmt.Println("Goodbye!") return default: fmt.Println("Invalid choice. Please try again.") } } } func addCustomer() { var name, email, phone string fmt.Print("Enter customer name: ") fmt.Scanln(&name) fmt.Print("Enter customer email: ") fmt.Scanln(&email) fmt.Print("Enter customer phone: ") fmt.Scanln(&phone) statement, err := db.Prepare("INSERT INTO customer (name, email, phone) VALUES (?, ?, ?)") if err != nil { fmt.Println(err) return } defer statement.Close() result, err := statement.Exec(name, email, phone) if err != nil { fmt.Println(err) return } rowsAffected, err := result.RowsAffected() if err != nil { fmt.Println(err) return } fmt.Printf("Customer added successfully! %d rows affected.\n", rowsAffected) } func viewCustomers() { rows, err := db.Query("SELECT * FROM customer") if err != nil { fmt.Println(err) return } defer rows.Close() fmt.Println("Customer List:") fmt.Println("------------------------") for rows.Next() { var customer Customer err := rows.Scan(&customer.id, &customer.name, &customer.email, &customer.phone) if err != nil { fmt.Println(err) return } fmt.Printf("ID: %d\nName: %s\nEmail: %s\nPhone: %s\n\n", customer.id, customer.name, customer.email, customer.phone) } } ``` 这个程序使用 `database/sql` 包来连接 MySQL 数据库,然后通过 `sql.DB` 来执行 SQL 语句。`addCustomer()` 函数用来添加新的客户,先使用 `db.Prepare()` 方法来准备 SQL 语句,然后使用 `statement.Exec()` 方法来执行插入操作。`viewCustomers()` 函数用来查看所有客户信息,使用 `db.Query()` 方法来执行查询操作,然后使用 `rows.Scan()` 方法将查询结果扫描到 `Customer` 结构体中。注意,需要在程序结束时关闭数据库连接,可以使用 `defer` 关键字来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值