如何在GO中正确的使用数据库

package common

import (
	"database/sql"
	"fmt"
	"os"
	"os/signal"
	"syscall"

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

var Db *sql.DB

func init() {
	dsn := "user:passwd@tcp(127.0.0.1:port)/database"

	db, err := sql.Open("mysql", dsn)
	if err != nil {
		panic(err)
	}
	db.SetMaxOpenConns(20)
	db.SetMaxIdleConns(10)
	Db = db //将Db赋值为全局

//守护进程,如果进程退出就执行关闭的操作
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, os.Interrupt, os.Kill, syscall.SIGTTOU, syscall.SIGTERM)

	go func() {
		sig := <-sigs
		fmt.Println()
		fmt.Println(sig)
		close(sigs)//关闭channel
		Db.Close()
		fmt.Println("退出")
		//TODO 需要优化的点
		os.Exit(0)
	}()
}

如何使用

func QueryRowDemo(id int64) (*Notification, error) {
	sqlStr := "select notice_warn_id,code from asap_operate_notice_warn where notice_warn_id=?"
	stmt, err := common.Db.Prepare(sqlStr)//主要是这里直接导包然后调用就行
	if err != nil {
		log.Fatal(err)
		return nil, err
	}
	defer stmt.Close()

	var u Notification
	err = stmt.QueryRow(id).Scan(&u.NotificationId, &u.Code)
	switch {
	case err == sql.ErrNoRows:
		log.Fatalf("no notice with id %d", id)
		return nil, err
	case err != nil:
		log.Fatal(err)
		return nil, err
	default:
		log.Printf("username is %s\n", u.Code)
		return &u, err
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值