实现grammer用来分析构造器中的select,columns,from,wheres grammer.go
package kdbimport ( "fmt" "strings")type Grammar struct {}func NewGrammar() *Grammar { return new(Grammar)}func (g *Grammar) compileSelect(b *Builder) string { if len(b.columns) == 0 { b.columns = []string{"*"} } return fmt.Sprintf("select %s", strings.TrimSpace(strings.Join(g.compileComponents(b), " ")))}func (g *Grammar) compileComponents(b *Builder) []string { sql := make([]string, 0) if len(b.columns) > 0 { sql = append(sql, g.compileColumns(b)) } if b.table != "" { sql = append(sql, g.compileFrom(b)) } if len(b.wheres) > 0 { whereSql := g.compileWheres(b) if whereSql != "" { sql = append(sql, whereSql) } } return sql}func (g *Grammar) compileColumns(b *Builder) string { return g.wrapColumn(b.columns...)}func (g *Grammar) compileFrom(b *Builder) string { return fmt.Sprintf("from %s", g.wrapTable(b.table))}func (g *Grammar) compileWheres(b *Builder) string { var sql string for k, w := range b.wheres { if k == 0 { w.glue = "" } switch w.typ { case "basic": sql = fmt.Sprintf("%s %s %s %s %s", strings.TrimSpace(sql), w.glue, g.wrapColumn(w.column.(string)), w.operator, "?") case "null": sql = fmt.Sprintf("%s %s %s %s %s", strings.TrimSpace(sql), w.glue, g.wrapColumn(w.column.(string)), w.operator, w.value) } } return fmt.Sprintf("where %s", strings.TrimSpace(sql))}func (g *Grammar) wrapTable(table string) string { return fmt.Sprintf("%s%s", "", table)}func (g *Grammar) wrapColumn(columns ...string) string { for i, column := range columns { segments := strings.Split(column, ".") if len(segments) > 1 { segments[0] = g.wrapTable(segments[0]) if segments[1] != "*" && !strings.Contains(segments[0], "->") { segments[1] = fmt.Sprintf("`%s`", segments[1]) } } else { if segments[0] != "*" && !strings.Contains(segments[0], "->") { segments[0] = fmt.Sprintf("`%s`", segments[0]) } } column = strings.Join(segments, ".") columns[i] = column } return fmt.Sprintf("%s", strings.Join(columns, ", "))}现在我们简单SQL的构造器和解析器就已经实现了 。剩下的就是去实现update,insert,delete,join操作,union操作,whereIn等内容了,如果大家感兴趣,可以到 https://github.com/nopsky/kdb 查看完整版 。
希望本文对你所有帮助,由于本人才疏学浅,如果有什么不对的地方,欢迎大家指出 。
【使用 Go 打造另一款简单实用的 ORM】
推荐阅读
- 使用Redis轻松实现秒杀系统
- 使用Arkime抓包,捕获解密HTTPS流量
- 梦境是不是另一个平行世界 做梦是不是平行时空的记忆
- 投影仪灯泡寿命是多久 如何延长投影机灯泡使用寿命
- datedif函数的使用方法?DATEDIF函数_1
- 测试人员如何使用Git部署测试环境?
- 数据库中的索引,原理是什么?为什么查询使用索引就会快?
- 为什么使用移动路由的人,往往不愿意使用手机热点?
- raise3d打印机使用教程?raise3d打印机中文说明书
- 打造好运连连的客厅风水