世界杯欧洲区预选赛_世界杯足球几年一次 - chinaacecloud.com



ent裸SQL执行

ent裸SQL执行使用的client需要多封装一层,示例如下:

package main

import (

"context"

"entgo.io/ent/dialect/sql"

"fmt"

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

"github.com/realcp1018/tinylog"

"os"

"test/ent"

"test/ent/car"

"test/ent/user"

"time"

)

var Logger = tinylog.NewStreamLogger(tinylog.INFO)

func main() {

dsnStr := "user:password@tcp(host:port)/?parseTime=True"

drv, err := sql.Open("mysql", dsnStr)

if err != nil {

Logger.Error(err.Error())

os.Exit(1)

}

// Get the underlying sql.DB object of the driver.

db := drv.DB()

db.SetMaxIdleConns(10)

db.SetMaxOpenConns(10)

db.SetConnMaxLifetime(time.Hour)

// 相比于直接Open DSN获取连接,封装entgo.io/ent/dialect/sql.*DB显然更加适合生产环境,即有连接池的支持,又可以支持执行裸SQL

client := ent.NewClient(ent.Driver(drv))

//client, _ := ent.Open("mysql", dsnStr)

defer client.Close()

_ = RawSQLQueryUser(context.Background(), client)

}

func RawSQLQueryUser(ctx context.Context, client *ent.Client) error {

q := "select * from users"

result, err := client.QueryContext(ctx, q)

if err != nil {

return err

}

// QueryContext

for result.Next() {

myuser := new(ent.User)

_ = result.Scan(&myuser.ID, &myuser.Name, &myuser.Age, &myuser.Address)

fmt.Println(myuser.ID, myuser.Name, myuser.Age, myuser.Address)

}

return nil

}

dialect/sql就是针对标准库database/sql的封装,目前dialect/sql只支持QueryContext和ExecContext两个方法,所以查询单条SQL也只能通过result.Next来Scan获取结果。

标准库中有关于QueryContext的说明和示例,参考:https://pkg.go.dev/database/sql#DB.QueryContext