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 }