github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/sqx/exec_test.go (about)

     1  package sqx_test
     2  
     3  import (
     4  	"database/sql"
     5  	"errors"
     6  	"fmt"
     7  	"testing"
     8  
     9  	"github.com/bingoohuang/gg/pkg/sqlparse/sqlparser"
    10  	"github.com/bingoohuang/gg/pkg/sqx"
    11  	_ "github.com/go-sql-driver/mysql"
    12  	_ "github.com/jackc/pgx/v4/stdlib"
    13  	_ "github.com/mattn/go-sqlite3"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func TestQueryAsBeans(t *testing.T) {
    18  	// 创建数据库连接池
    19  	_, db, err := sqx.Open("sqlite3", ":memory:")
    20  	assert.Nil(t, err)
    21  
    22  	effectedRows, err := sqx.NewSQL("create table person(id varchar(100), age int)").Update(db)
    23  	assert.Nil(t, err)
    24  	assert.Equal(t, int64(0), effectedRows)
    25  	effectedRows, err = sqx.NewSQL("insert into person(id, age) values(?)", "嫦娥", 1000).Update(db)
    26  	assert.Nil(t, err)
    27  	assert.Equal(t, int64(1), effectedRows)
    28  	effectedRows, err = sqx.NewSQL("insert into person(id, age) values(?, ?)", "悟空", 500).Update(db)
    29  	assert.Nil(t, err)
    30  	assert.Equal(t, int64(1), effectedRows)
    31  
    32  	m, err := sqx.NewSQL("select id, age from person where id=?", "嫦娥").QueryAsMap(db)
    33  	assert.Nil(t, err)
    34  	assert.Equal(t, map[string]string{"age": "1000", "id": "嫦娥"}, m)
    35  
    36  	r, err := sqx.NewSQL("select id, age from person where id=?", "嫦娥").QueryAsRow(db)
    37  	assert.Nil(t, err)
    38  	assert.Equal(t, []string{"嫦娥", "1000"}, r)
    39  
    40  	var ids []string
    41  	err = sqx.NewSQL("select id from person order by age").Query(db, &ids)
    42  	assert.Nil(t, err)
    43  	assert.Equal(t, []string{"悟空", "嫦娥"}, ids)
    44  
    45  	var ages []int
    46  	err = sqx.NewSQL("select age from person order by age").Query(db, &ages)
    47  	assert.Nil(t, err)
    48  	assert.Equal(t, []int{500, 1000}, ages)
    49  
    50  	var age1 int
    51  	err = sqx.NewSQL("select age from person order by age").Query(db, &age1)
    52  	assert.Nil(t, err)
    53  	assert.Equal(t, 500, age1)
    54  
    55  	type Person struct {
    56  		ID string
    57  		Ag int `col:"AGE"`
    58  	}
    59  
    60  	var ps []Person
    61  	err = sqx.NewSQL("select id, age from person where id=?", "嫦娥").Query(db, &ps)
    62  	assert.Nil(t, err)
    63  	assert.Equal(t, []Person{{ID: "嫦娥", Ag: 1000}}, ps)
    64  
    65  	err = sqx.NewSQL("select id, age from person where id in(?) order by age desc", "嫦娥", "悟空").Query(db, &ps)
    66  	assert.Nil(t, err)
    67  	assert.Equal(t, []Person{{ID: "嫦娥", Ag: 1000}, {ID: "悟空", Ag: 500}}, ps)
    68  
    69  	ps = nil
    70  	err = sqx.NewSQL("select id, age from person where id in(?) order by age desc").Query(db, &ps)
    71  	assert.True(t, errors.Is(err, sql.ErrNoRows))
    72  	assert.Equal(t, 0, len(ps))
    73  
    74  	var p Person
    75  	err = sqx.NewSQL("select id, age from person where id=?", "嫦娥").Query(db, &p)
    76  	assert.Nil(t, err)
    77  	assert.Equal(t, Person{ID: "嫦娥", Ag: 1000}, p)
    78  
    79  	var p2 *Person
    80  	err = sqx.NewSQL("select id, age from person where id=?", "嫦娥").Query(db, &p2)
    81  	assert.Nil(t, err)
    82  	assert.Equal(t, Person{ID: "嫦娥", Ag: 1000}, *p2)
    83  
    84  	var p3 *Person
    85  	err = sqx.NewSQL("select id, age from person where id=?", "八戒").Query(db, &p3)
    86  	assert.Nil(t, p3)
    87  	assert.True(t, errors.Is(err, sql.ErrNoRows))
    88  
    89  	age, err := sqx.NewSQL("select age from person where id=?", "嫦娥").QueryAsNumber(db)
    90  	assert.Nil(t, err)
    91  	assert.Equal(t, int64(1000), age)
    92  
    93  	id, err := sqx.NewSQL("select id from person where id=?", "嫦娥").QueryAsString(db)
    94  	assert.Nil(t, err)
    95  	assert.Equal(t, "嫦娥", id)
    96  }
    97  
    98  func TestDriverName(t *testing.T) {
    99  	pg := "postgres://SYSTEM:111111@192.168.126.245:54322/METRICS_UMP?sslmode=disable"
   100  	// 创建数据库连接池
   101  	db, d, err := sqx.Open("pgx", pg)
   102  	assert.Nil(t, err)
   103  	assert.Equal(t, "pgx", sqx.DriverName(db.Driver()))
   104  	assert.Equal(t, sqlparser.Postgresql, d.GetDBType())
   105  
   106  	sq := sqx.SQL{
   107  		Q:    `INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES(:?)`,
   108  		Vars: []interface{}{"Paul", 32, "California", 20000.00},
   109  	}
   110  	if d.GetDBType() == sqlparser.Postgresql || d.GetDBType() == sqlparser.Kingbase {
   111  		sq.AppendQ = `RETURNING ID`
   112  	}
   113  
   114  	id, err := sq.QueryAsNumber(d)
   115  	fmt.Println(id, err)
   116  }
   117  
   118  func TestQuery(t *testing.T) {
   119  	raw, db := openDB(t)
   120  	assert.Equal(t, "sqlite3", sqx.DriverName(raw.Driver()))
   121  
   122  	_, err := sqx.SQL{Q: "create table person(id varchar(100), age int)"}.Update(db)
   123  	assert.Nil(t, err)
   124  	s := sqx.SQL{Q: "insert into person(id, age) values(?)"}
   125  	_, err = s.WithVars("嫦娥", 1000).Update(db)
   126  	assert.Nil(t, err)
   127  	_, err = s.WithVars("悟空", 500).Update(db)
   128  	assert.Nil(t, err)
   129  
   130  	s = sqx.SQL{Q: "select id, age from person"}
   131  	m, err := s.Append("where id=?", "嫦娥").QueryAsMap(db)
   132  	assert.Nil(t, err)
   133  	assert.Equal(t, map[string]string{"id": "嫦娥", "age": "1000"}, m)
   134  
   135  	type Person struct {
   136  		ID string
   137  		Ag int `col:"AGE"`
   138  	}
   139  
   140  	var ps []Person
   141  	assert.Nil(t, s.Query(db, &ps))
   142  	assert.Equal(t, []Person{{ID: "嫦娥", Ag: 1000}}, ps)
   143  
   144  	var p Person
   145  	assert.Nil(t, s.Query(db, &p))
   146  	assert.Equal(t, Person{ID: "嫦娥", Ag: 1000}, p)
   147  
   148  	s = sqx.SQL{Q: "select age from person"}
   149  	age, err := s.Append("where id=?", "嫦娥").QueryAsNumber(db)
   150  	assert.Nil(t, err)
   151  	assert.Equal(t, int64(1000), age)
   152  
   153  	var ageValue int
   154  
   155  	err = s.QueryRaw(db, sqx.WithScanRow(func(columns []string, rows *sql.Rows, _ int) (bool, error) {
   156  		return false, rows.Scan(&ageValue)
   157  	}))
   158  	assert.Nil(t, err)
   159  	assert.Equal(t, 1000, ageValue)
   160  }