geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。
https://geektutu.com
Apache License 2.0
166 stars 21 forks source link

动手写ORM框架 - GeeORM第一天 database/sql 基础 | 极客兔兔 #74

Open geektutu opened 4 years ago

geektutu commented 4 years ago

https://geektutu.com/post/geeorm-day1.html

7天用 Go语言/golang 从零实现 ORM 框架 GeeORM 教程(7 days implement golang object relational mapping framework from scratch tutorial),动手写 ORM 框架,参照 gorm, xorm 的实现。介绍了 SQLite 的基础操作(连接数据库,创建表、增删记录等),使用 Go 标准库 database/sql 操作 SQLite 数据库,包括执行(Exec),查询(Query, QueryRow)。

wuqinqiang commented 4 years ago

测试代码是不是多了一行 , = s.Raw("CREATE TABLE User(Name text);").Exec() , = s.Raw("CREATE TABLE User(Name text);").Exec()

kingofzihua commented 3 years ago

@wuqinqiang 测试代码是不是多了一行 , = s.Raw("CREATE TABLE User(Name text);").Exec() , = s.Raw("CREATE TABLE User(Name text);").Exec()

故意的啊,可以看到sql执行错误的时候 是红色的。

boyl commented 3 years ago

Session Clear() 方法不考虑并发吗,并发应该会带来问题把

jjmengze commented 3 years ago

想請教,session struct 中的sql 為什麼要用 strings.Builder,這個設計的理由為何?

Gemini-Lin commented 3 years ago

@jjmengze 想請教,session struct 中的sql 為什麼要用 strings.Builder,這個設計的理由為何?

浅谈一下自己的理解,session struct 是会在会话中复用的,如果使用 string 类型,string 是只读不可变的,每次修改其实都要重新申请一个内存空间,都是一个新的 string,而 string.Builder 底层使用 []byte 实现。

jjmengze commented 3 years ago

@jjmengze 想請教,session struct 中的sql 為什麼要用 strings.Builder,這個設計的理由為何?

浅谈一下自己的理解,session struct 是会在会话中复用的,如果使用 string 类型,string 是只读不可变的,每次修改其实都要重新申请一个内存空间,都是一个新的 string,而 string.Builder 底层使用 []byte 实现。

@Gemini-Lin 學習了,謝謝~

raykn commented 3 years ago

func (engine *Engine) Close() close err 后直接 return

wanhhe commented 2 years ago

geeorm.go 里面貌似少导了github.com/mattn/go-sqlite3

simaopig commented 2 years ago

@wanhhe geeorm.go 里面貌似少导了github.com/mattn/go-sqlite3

在main里引用 的,geeorm.go 不依赖具体的驱动

FOOLISH06 commented 2 years ago

几点疑问和建议:

  1. GeeOrm 的不同功能在不同包中,而 Gee 的所有功能都在一个包里面,gorm v1 、 gorm v2 和 xorm 各有取舍,这两种方式哪种更好?
  2. log 包的取名容易让人误解为 go 官方的包,建议改名为 mylog 、logger 之类的。
  3. 错误处理:例如下面的代码,错误已经在函数内处理了,为什么还要再返回呢?
    // QueryRows gets a list of records from db
    func (s *Session) QueryRows() (rows *sql.Rows, err error) {
    defer s.Clear()
    log.Info(s.sql.String(), s.sqlVars)
    if rows, err = s.DB().Query(s.sql.String(), s.sqlVars...); err != nil {
        log.Error(err)
    }
    return
    }
niconical commented 2 years ago

@FOOLISH06 几点疑问和建议:

  1. GeeOrm 的不同功能在不同包中,而 Gee 的所有功能都在一个包里面,gorm v1 、 gorm v2 和 xorm 各有取舍,这两种方式哪种更好?
  2. log 包的取名容易让人误解为 go 官方的包,建议改名为 mylog 、logger 之类的。
  3. 错误处理:例如下面的代码,错误已经在函数内处理了,为什么还要再返回呢?
    // QueryRows gets a list of records from db
    func (s *Session) QueryRows() (rows *sql.Rows, err error) {
    defer s.Clear()
    log.Info(s.sql.String(), s.sqlVars)
    if rows, err = s.DB().Query(s.sql.String(), s.sqlVars...); err != nil {
      log.Error(err)
    }
    return
    }

    geeorm里面你提到的err只是log了,没有进一步处理,所以作者还是往上抛了。我感觉是geeorm 的error没有处理好

Amber2011 commented 5 days ago

Windwos下有C相关报错的可以使用TDM-GCC 来解决. 我原本电脑上的gcc是用cygwin装的,有报错,折腾了老半天