golang连接数据库

config

var DnsDevConfInstance *DnsDevConf

var DnsDevConfInstanceOnceDo sync.Once
// 
func SingleNewDnsDevConf() *DnsDevConf {
	if DnsDevConfInstance == nil {
		DnsDevConfInstanceOnceDo.Do(func() {
			DnsDevConfInstance = NewDnsDevConf()
		})
	}
	return DnsDevConfInstance
}

func NewDnsDevConf() *DnsDevConf {
	// 加载配置文件
	conf, _ := load()
	return &DnsDevConf{
		DnsSever: conf.DnsSever,
		Db:       conf.Db,
	}
}

type DnsDevConf struct {
	DnsSever *DnsSeverConf `json:"dns_conf"`
	Db       *DatabaseConf `json:"db"`
}

type DatabaseConf struct {
	Host   string `json:"host"`
	Driver string `json:"driver"`
	DbName string `json:"db_name"`
	User   string `json:"user"`
	Passwd string `json:"passwd"`
}


//连接

package mysqlconn

import (
	"database/sql"
	"config"
	"fmt"
	// mysql 驱动
	_ "github.com/go-sql-driver/mysql"
)

type DbConn struct {
	user   string
	passwd string
	host   string
	dbName string
	driver string
	*sql.DB
}

// 读配置文件
func NewMysqlDb() *DbConn {
	
	dbconf := config.SingleNewDnsDevConf().GetConf().Db
	return &DbConn{user: dbconf.User,
		passwd: dbconf.Passwd,
		host:   dbconf.Host,
		dbName: dbconf.DbName,
		driver: dbconf.Driver}
}

// 传值
func NewMysqlDbPrams(conf *config.DatabaseConf) *DbConn {
	return &DbConn{user: conf.User,
		passwd: conf.Passwd,
		host:   conf.Host,
		dbName: conf.DbName,
		driver: conf.Driver}
}

func (d *DbConn) Connect() error {
	mysqldns := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=true",
		d.user, d.passwd, d.host, d.dbName)
	fmt.Println(mysqldns)
	db, err := sql.Open(d.driver, mysqldns)
	if err != nil {
		return err
	} else {
		d.DB = db
		return nil
	}
}

func (d *DbConn) Close() error {
	return d.DB.Close()
}

封装

func GetMdb() *MysqlDb {
	if mdb == nil {
		mdbOnce.Do(func() {
		    // 读配置文件
			d := config.GetRConf().GetMysqlDb()
			mysqldns := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=true",
				d.User, d.Passwd, d.Host, d.DbName)
			db, err := sql.Open(d.Driver, mysqldns)
			if err != nil {
				panic(err)
			}
			mdb = &MysqlDb{
				Mysql: db,
			}

		})
	}

	return mdb
}

测试

 package test

import (
	"db/mysqlconn"
	"fmt"
	"testing"
)

func TestSqlConn(t *testing.T) {
	db := mysqlconn.NewMysqlDb()
	if err := db.Connect(); err != nil {
		panic(err)
	}
	if err := db.Ping(); err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("conn success")
	}

}

插入数据:
package sql

import (
	"dnsdao.resolver/db/conn"
	"errors"
	"github.com/ethereum/go-ethereum/core/types"
)

func InsertBuydomain(conn *conn.DbConn, seller string, buyer string, namehash string, log *types.Log) error {
	if res, err := conn.Exec("Insert into buydomain (seller,buyer,domain) VALUES (?,?,?)",
		seller,
		buyer,
		namehash,
	); err != nil {
		return err
	} else if res == nil {
		return errors.New("no data insert or insert failed")
	}

	return nil
}

func InsertManyBuydomain(conn *conn.DbConn, sql_ string) error {
	if res, err := conn.Exec("Insert into buydomain (seller,buyer,domain) VALUES " + sql_[:len(sql_)-1] + ";"); err != nil {
		return err
	} else if res == nil {
		return errors.New("no data insert or insert failed")
	}

	return nil
}

Mongo

package ldb

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
	"sync"
)

type Mdb struct {
	db *mongo.Database
}

var (
	mdb     *Mdb
	mdbOnce sync.Once
)

func GetMdb() *Mdb {
	if mdb == nil {
		mdbOnce.Do(func() {
			var err error
			clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
			// 连接到MongoDB
			mgoCli, err := mongo.Connect(context.TODO(), clientOptions)
			if err != nil {
				log.Fatal(err)
			}
			// 检查连接
			err = mgoCli.Ping(context.TODO(), nil)
			if err != nil {
				log.Fatal(err)
			}
			db := mgoCli.Database("mintsign")
			mdb = &Mdb{
				db: db,
			}
			// 建索引

		})
	}

	return mdb
}
func SELECT(Table string, Filter bson.M, OptionsFind *options.FindOptions) ([]map[string]string, error) {
	var err error
	db := GetMdb().db
	coll := db.Collection(Table)
	var data []map[string]string
	findres, err := coll.Find(context.TODO(), Filter, OptionsFind)
	defer findres.Close(context.TODO())
	if err != nil {
		log.Println(fmt.Sprintf("Find table:%s Filter %s  err:%s", Table, Filter, err))
		return nil, err
	}
	defer findres.Close(context.TODO())
	err = findres.All(context.TODO(), &data)
	if err != nil {
		log.Println("mongo decode err", err)
		return nil, err
	} else {
		return data, nil
	}
}

func UPDATEOne(Table string, Filter bson.M, UpdateData bson.M) (bool, error) {
	var err error
	db := GetMdb().db
	coll := db.Collection(Table)
	var upres *mongo.UpdateResult
	up := bson.M{"$set": UpdateData}
	upres, err = coll.UpdateOne(context.TODO(), Filter, up)
	if err != nil {
		log.Println("Mongo Update failed", err)
		return false, err
	} else {
		log.Println("Mongo Update success", upres.UpsertedID)
		return true, nil
	}
}

func INSERTOne(Table string, InsertData bson.M) {
	var err error
	db := GetMdb().db
	coll := db.Collection(Table)
	var res *mongo.InsertOneResult
	res, err = coll.InsertOne(context.TODO(), InsertData)
	if err != nil {
		log.Println(fmt.Sprintf("Table %s InsertData %v err %v", Table, InsertData, err))
	} else {
		log.Println(fmt.Sprintf("Table %s InsertData %v success %v", Table, InsertData, res.InsertedID))
	}
}

test

package ldb

import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/x/bsonx"
	"log"
	"testing"
)

func createIndexes() error {
	var err error
	db := GetMdb().db
	coll := db.Collection("signcoll")
	indexes := map[string]mongo.IndexModel{
		//"_tokenid_name_": {
		//	Keys: bsonx.Doc{
		//		// 联合索引
		//		// 1 为指定按升序创建索引
		//		{"tokenid", bsonx.Int32(1)},
		//		{"name", bsonx.Int32(1)},
		//	},
		//	//_tokenid_name_ 索引名称
		//	Options: options.Index().SetBackground(true).SetName("_tokenid_name_"),
		//},
		"_name_": {
			Keys: bsonx.Doc{
				{"name", bsonx.Int32(1)},
			},
			//_tokenid_name_ 索引名称
			Options: options.Index().SetBackground(true).SetName("_name_"),
		},
	}
	//查询已经存在的索引
	//cursor, err := coll.Indexes().List(context.Background())
	//if err != nil {
	//	log.Fatalln(err)
	//}
	//for cursor.Next(context.Background()) {
	//	var idx []mongo.IndexModel
	//	err = cursor.All(context.TODO(), &idx)
	//	//err = cursor.Decode(&idx)
	//	if err != nil {
	//		log.Println("Decode Index error", err)
	//		continue
	//	}
	//	log.Println(idx)
	//	//if idx != nil {
	//	//	// 删除添加的重复索引
	//	//	//delete(indexes, *idx.Options.Name)
	//	//}
	//}
	// 添加索引
	models := []mongo.IndexModel{}
	for _, v := range indexes {
		models = append(models, v)
	}
	if len(models) > 0 {
		var names []string
		names, err = coll.Indexes().CreateMany(context.Background(), models)
		if err != nil {
			log.Fatalln(err)
		}
		log.Println("Create Indexes", names)
	}
	return err
}

func TestIndex(t *testing.T) {
	createIndexes()
}
func TestMongo(t *testing.T) {
	var err error
	db := GetMdb().db
	log.Println(db.Name())
	coll := db.Collection("signcoll")
	filter := bson.M{"name": "x.did", "msg_sender": "0x000"}
	var data []map[string]string
	// options.Find().SetSkip(0), options.Find().SetLimit(1) 0页  1每页数据量
	findres, _ := coll.Find(context.TODO(), filter, options.Find().SetSkip(0), options.Find().SetLimit(1))
	defer findres.Close(context.TODO())
	err = findres.All(context.TODO(), &data)
	if err != nil {
		log.Println("mongo decode err", err)
	}
	if data == nil {
		res, _ := coll.InsertOne(context.TODO(), map[string]string{"name": "x.did", "msg_sender": "0x000", "tokenid": "1"})
		log.Println("InsertOne", res.InsertedID)
	} else {
		up := bson.M{"$set": bson.M{"tokenid": "2"}}
		upres, err := coll.UpdateOne(context.TODO(), filter, up)
		if err != nil {
			log.Println("Mongo Update failed", err)
		} else {
			log.Println("Mongo Update ", upres.UpsertedID)
		}
	}
	// coll.Indexes().CreateOne(context.TODO())

}

func TestSelect(t *testing.T) {
	filter := bson.M{"name": "x.did", "msg_sender": "0x000"}
	options.Find().SetSkip(0)
	options.Find().SetLimit(1)
	op := &options.FindOptions{Skip: func(i int64) *int64 { return &i }(0), Limit: func(i int64) *int64 { return &i }(10)}
	res, err := SELECT("signcoll", filter, op)
	if err != nil {
		log.Println(err)
	} else {
		log.Println(res)
	}
}
func TestInsertOne(t *testing.T) {
	insert := bson.M{"name": "x.did", "msg_sender": "0x000", "tokenid": "6"}
	INSERTOne("signcoll", insert)
}

func TestUpdate(t *testing.T) {
	filter := bson.M{"name": "x.did", "msg_sender": "0x0002"}
	up := bson.M{"tokenid": "2"}
	state, _ := UPDATEOne("signcoll", filter, up)
	log.Println(state)
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值