代码拉取完成,页面将自动刷新
同步操作将从 unsafe-rust/sq 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package sq
import (
"fmt"
"strings"
)
// SQL 表达式
type expr struct {
expr string
args []interface{}
}
// Expr 生成原始SQL表达式,例如:
// sq.Table("user").Update(map[string]interface{}{"price", sq.Expr("price * ? + ?", 2, 100)})
func Expr(expression string, args ...interface{}) *expr {
return &expr{expr: expression, args: args}
}
// SQL语句构造器
type SqlBuilder struct {
dialect Dialect // SQL数据库方言(例如:mysql,mssql...)
fields string // 数据库表中的字段
table string // 数据库表名
forceIndex string // 强制使用索引
where string
order string
limit string
offset string
hint string // 查询优化器提示
args []interface{} // where子句中要替换的额外args
}
func (s *SqlBuilder) limitFormat() string {
if s.limit != "" {
return fmt.Sprintf("LIMIT %s", s.limit)
}
return ""
}
func (s *SqlBuilder) offsetFormat() string {
if s.offset != "" {
return fmt.Sprintf("OFFSET %s", s.offset)
}
return ""
}
func (s *SqlBuilder) orderFormat() string {
if s.order != "" {
return fmt.Sprintf("ORDER BY %s", s.order)
}
return ""
}
//queryString 组装查询语句。
func (s *SqlBuilder) queryString() string {
if s.fields == "" {
s.fields = "*"
}
table := s.dialect.Quote(s.table) // 在表名上加上 ``,例如: `user`表
if s.forceIndex != "" {
table += fmt.Sprintf(" force index(%s)", s.forceIndex)
}
query := fmt.Sprintf("%sSELECT %s FROM %s %s %s %s %s", s.hint, s.fields, table, s.where, s.orderFormat(), s.limitFormat(), s.offsetFormat())
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
//countString 组装count语句
func (s *SqlBuilder) countString() string {
query := fmt.Sprintf("%sSELECT count(*) FROM %s %s", s.hint, s.dialect.Quote(s.table), s.where)
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
//insertString 组装插入语句
func (s *SqlBuilder) insertString(params map[string]interface{}) string {
var cols, values []string
for _, k := range sortedParamKeys(params) { //该函数在2_util.go中
cols = append(cols, s.dialect.Quote(k))
values = append(values, "?")
s.args = append(s.args, params[k])
}
return fmt.Sprintf("INSERT INTO %s (%s) VALUES(%s);", s.dialect.Quote(s.table), strings.Join(cols, ","), strings.Join(values, ","))
}
//updateString 组装更新语句
func (s *SqlBuilder) updateString(params map[string]interface{}) string {
var updateFields []string
args := make([]interface{}, 0)
for _, k := range sortedParamKeys(params) {
if e, ok := params[k].(*expr); ok {
updateFields = append(updateFields, fmt.Sprintf("%s=%s", s.dialect.Quote(k), e.expr))
args = append(args, e.args...)
} else {
updateFields = append(updateFields, fmt.Sprintf("%s=?", s.dialect.Quote(k)))
args = append(args, params[k])
}
}
args = append(args, s.args...)
s.args = args
query := fmt.Sprintf("UPDATE %s SET %s %s", s.dialect.Quote(s.table), strings.Join(updateFields, ","), s.where)
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
//deleteString 组装删除语句
func (s *SqlBuilder) deleteString() string {
query := fmt.Sprintf("DELETE FROM %s %s", s.dialect.Quote(s.table), s.where)
query = strings.TrimRight(query, " ")
query = query + ";"
return query
}
func (s *SqlBuilder) Where(str string, args ...interface{}) {
if s.where != "" {
s.where = fmt.Sprintf("%s AND (%s)", s.where, str)
} else {
s.where = fmt.Sprintf("WHERE (%s)", str)
}
// 将 args存入 s.args中
if args != nil {
if s.args == nil {
s.args = args
} else {
s.args = append(s.args, args...)
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。