我应该在GO中的数据库查询中使用Sql.Stmt还是字符串?

时间:2016-09-19 11:49:25

标签: go

您好在database / sql包中我可以通过两种方式执行查询:

  • 第一种方式:使用Sql.Stmt

    var DeletePermissionStmt *sql.Stmt
    DeletePermissionStmt, err = database.Prepare(`DELETE FROM permission WHERE permission_id=$1`)
    
    if err != nil {
         log.Errorf("can't prepare delete permission statement: %s", err.Error())
    }
    
    transaction, err := database.Begin()  // assume postgres database is defined previously
    
    if err != nil {
         log.WithFields(logFields).Errorf("can't start transaction: %s", err.Error())
    
    
    return err
    }
     _, err := transaction.Stmt(DeletePermissionStmt).Exec(permission_id)
    
  • 第二种方式:使用字符串

    var DeletePermissionStmt string
    DeletePermissionStmt = `DELETE FROM permission WHERE permission_id=$1`
    
    transaction, err := database.Begin()  // assume postgres database is defined previously
    
    if err != nil {
    log.WithFields(logFields).Errorf("can't start transaction: %s", err.Error())
    
    
    return err
    }
     _, err := transaction.Exec(DeletePermissionStmt,permission_id)
    

唯一的区别我知道当你返回一些东西时,它不可能使用sql.Stmt Insert Into FOO(f1,f2,f3) Values(v1,v2,v3) returning f_id 还有其他差异吗?我什么时候应该使用每一个?

1 个答案:

答案 0 :(得分:1)

使用Stmt可以帮助您避免用户进行sql注入。

来自wikipedia

  

准备好的语句可以抵御SQL注入,因为   参数值,稍后使用不同的值传输   协议,无需正确转义。如果是原始声明   模板不是从外部输入派生的,SQL注入不了   发生。