0

我正在为 Postgresql 使用 Go 和Gorm

我想了解两者之间的区别

  1. 这个:

    var name = "myName"
    var user User
    
    db.Where("user like ?", name).Find(&user)
    
  2. 和这个:

    var user User
    
    db.Where("user like " + name).Find(&user)
    

SQL 查询是相同的。

我的意思是,我们为什么要使用 ORM?

  1. #1 可以成为准备好的陈述吗?

  2. #1比#2“更优化”吗?

  3. “更优化”是什么意思?

4

1 回答 1

2

要专门回答您的问题:

#1 可以成为准备好的陈述吗?

通常 ORM 会构建准备好的语句,这样(正如 Flimzy 所解释的)您可以避免 sql 注入,并且数据库引擎不需要重新计算查询计划。

Gorm 似乎有一个用于缓存准备好的语句的特定配置: https ://gorm.io/docs/v2_release_note.html#Prepared-Statement-Mode

#1比#2“更优化”吗?

您可以从数据库角度和语言角度看到这部分。

  • 数据库:因为 #1 使用准备好的语句,如果您一次又一次地执行相同的查询,数据库引擎不需要重新计算查询(重新使用准备好的语句)
  • 语言: Golang 将为 创建一个字符串"user like",然后为连接创建另一个字符串"user like" + name。如果此代码多次执行(例如在循环中),您将看到执行时间增加,因为每个字符串都意味着分配了一个新的内存地址。

“更优化”是什么意思?

更优化意味着更快。如上所述:

  • 准备好的语句只帮助计算一次查询计划,这意味着下次执行相同的查询时,该计划不需要由数据库引擎计算,节省时间。(您通常会在复杂查询中看到这种差异)
  • 语言字符串连接可能会消耗资源
于 2020-10-21T15:11:30.010 回答