package sql import "strings" // Conditions 数据库条件 type Conditions struct { queries []string args [][]any err error } // NewConditions 创建数据库条件 func NewConditions() *Conditions { return &Conditions{ queries: make([]string, 0), args: make([][]any, 0), } } // AddCondition 添加条件 // 参数: // - query: 条件语句,如: name LIKE ? AND age = ? // - args: 预编译值,如: foo, 10 // 返回值: // - 数据库条件 func (conditions *Conditions) AddCondition(query string, args ...any) *Conditions { conditions.queries = append(conditions.queries, query) conditions.args = append(conditions.args, args) return conditions } // Equal 添加相等条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) Equal(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " = ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // Like 添加LIKE条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) Like(columnName string, arg string) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " LIKE ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // In 添加IN条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) In(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " IN ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // NotIn 添加NOT IN条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) NotIn(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " NOT IN ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // Not 添加不相等条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) Not(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " != ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // LessThan 添加小于条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) LessThan(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " < ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // LessThanAndEqual 添加小于等于条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) LessThanAndEqual(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " <= ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // GreaterThan 添加大于条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) GreaterThan(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " > ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // GreaterThanAndEqual 添加大于等于条件 // 参数: // - columnName: 列名 // - arg: 列值 // 返回值: // - 数据库条件 func (conditions *Conditions) GreaterThanAndEqual(columnName string, arg any) *Conditions { if conditions.err != nil { return conditions } conditions.appendQuery(columnName, " >= ?") conditions.args = append(conditions.args, []any{arg}) return conditions } // Queries 获取所有查询条件语句 // 参数: 无 // 返回值: // - 查询条件 func (conditions *Conditions) Queries() []string { return conditions.queries } // Args 获取所有查询条件值 // 参数: 无 // 返回值: // - 查询条件值 func (conditions *Conditions) Args() []any { args := make([]any, 0) for _, conditionArgs := range conditions.args { if conditionArgs == nil { continue } if len(conditionArgs) == 1 { args = append(args, conditionArgs[0]) } else { args = append(args, conditionArgs) } } return args } // And 获取构造的AND条件语句 // 参数: 无 // 返回值: // - 构造的AND条件语句 func (conditions *Conditions) And() string { return conditions.formClause("AND") } // OR 获取构造的OR条件语句 // 参数: 无 // 返回值: // - 构造的AND条件语句 func (conditions *Conditions) OR() string { return conditions.formClause("OR") } func (conditions *Conditions) appendQuery(columnName string, expr string) { conditions.queries = append(conditions.queries, `"`+columnName+`"`+expr) } func (conditions *Conditions) formClause(conditionOperator string) string { if conditions.queries == nil || len(conditions.queries) == 0 { return "" } stringBuilder := strings.Builder{} for i, query := range conditions.queries { stringBuilder.WriteString(query) if i != len(conditions.queries)-1 { stringBuilder.WriteString(" " + conditionOperator + " ") } } return stringBuilder.String() }