Skip to content

Commit 9f0a5e8

Browse files
authored
Merge pull request #17 from trheyi/main
feat: Implement Driver method and ExecWrite for enhanced query execution
2 parents 9db43dd + a0d2e32 commit 9f0a5e8

File tree

5 files changed

+70
-1
lines changed

5 files changed

+70
-1
lines changed

dbal/query/builder.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,23 @@ func UseBuilder(conn *Connection) *Builder {
3333
return useBuilder(conn)
3434
}
3535

36+
// Driver Get the driver name
37+
func (builder *Builder) Driver() (string, error) {
38+
if builder.Conn == nil {
39+
return "", fmt.Errorf("the connection is nil")
40+
}
41+
42+
if builder.Conn.WriteConfig != nil {
43+
return builder.Conn.WriteConfig.Driver, nil
44+
}
45+
46+
if builder.Conn.ReadConfig != nil {
47+
return builder.Conn.ReadConfig.Driver, nil
48+
}
49+
50+
return "", fmt.Errorf("the connection is nil")
51+
}
52+
3653
// Clone create a new builder instance with current builder
3754
func (builder *Builder) Clone() Query {
3855
return builder.clone()

dbal/query/builder_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,12 @@ func TestBuilderNew(t *testing.T) {
5454
dbReadonly := qb.DB(true)
5555
assert.True(t, dbReadonly.Ping() == nil, "The read-only connection should be made")
5656
}
57+
58+
func TestBuilderDriver(t *testing.T) {
59+
defer unit.Catch()
60+
unit.SetLogger()
61+
qb := getTestBuilder()
62+
driver, err := qb.Driver()
63+
assert.Nil(t, err, "The error should be nil")
64+
assert.Equal(t, unit.Driver(), driver, "The driver should be mysql")
65+
}

dbal/query/exec.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package query
22

33
import "database/sql"
44

5-
// Exec execute the sql, return the result
5+
// Exec Use the current connection to execute the sql, return the result
66
func (builder *Builder) Exec(sql string, bindings ...interface{}) (sql.Result, error) {
77
stmt, err := builder.DB().Prepare(sql)
88
if err != nil {
@@ -11,3 +11,13 @@ func (builder *Builder) Exec(sql string, bindings ...interface{}) (sql.Result, e
1111
defer stmt.Close()
1212
return stmt.Exec(bindings...)
1313
}
14+
15+
// ExecWrite Use the write connection to execute the sql, return the result
16+
func (builder *Builder) ExecWrite(sql string, bindings ...interface{}) (sql.Result, error) {
17+
stmt, err := builder.DB(true).Prepare(sql)
18+
if err != nil {
19+
return nil, err
20+
}
21+
defer stmt.Close()
22+
return stmt.Exec(bindings...)
23+
}

dbal/query/exec_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,34 @@ func TestExec(t *testing.T) {
3939
assert.Equal(t, int64(4), affected, "the rows affected should be 4")
4040
}
4141
}
42+
func TestExecWrite(t *testing.T) {
43+
NewTableForQueryTest()
44+
qb := getTestBuilder()
45+
rows := qb.From("table_test_query as t").
46+
Where("email", "like", "%@yao.run").
47+
OrderBy("id").
48+
MustGet()
49+
50+
assert.Equal(t, 4, len(rows), "the return rows should have 4 items")
51+
if len(rows) == 4 {
52+
assert.Equal(t, "96.32", fmt.Sprintf("%.2f", rows[0].Get("score")), "the return value should be true")
53+
assert.Equal(t, "64.56", fmt.Sprintf("%.2f", rows[1].Get("score")), "the return value should be true")
54+
assert.Equal(t, "99.27", fmt.Sprintf("%.2f", rows[2].Get("score")), "the return value should be true")
55+
assert.Equal(t, "48.12", fmt.Sprintf("%.2f", rows[3].Get("score")), "the return value should be true")
56+
}
57+
58+
// Exec
59+
if unit.Is("postgres") {
60+
res, err := qb.ExecWrite("update table_test_query set score = 100 where email like $1", "%@yao.run")
61+
assert.Nil(t, err, "the error should be nil")
62+
affected, err := res.RowsAffected()
63+
assert.Nil(t, err, "the error should be nil")
64+
assert.Equal(t, int64(4), affected, "the rows affected should be 4")
65+
} else {
66+
res, err := qb.ExecWrite("update table_test_query set score = 100 where email like ?", "%@yao.run")
67+
assert.Nil(t, err, "the error should be nil")
68+
affected, err := res.RowsAffected()
69+
assert.Nil(t, err, "the error should be nil")
70+
assert.Equal(t, int64(4), affected, "the rows affected should be 4")
71+
}
72+
}

dbal/query/interfaces.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type Query interface {
1515
Clone() Query
1616
Reset() Query
1717
Builder() *Builder
18+
Driver() (string, error)
1819

1920
// defined in the query.go file
2021
Table(name string) Query
@@ -179,6 +180,7 @@ type Query interface {
179180

180181
// defined in the exec.go file
181182
Exec(sql string, bindings ...interface{}) (sql.Result, error)
183+
ExecWrite(sql string, bindings ...interface{}) (sql.Result, error)
182184

183185
// defined in the debug.go file
184186
DD()

0 commit comments

Comments
 (0)