【问题标题】:Should I use Sql.Stmt or string in database query in GO?我应该在 GO 的数据库查询中使用 Sql.Stmt 还是字符串?
【发布时间】:2016-09-27 07:18:55
【问题描述】:

您好,在 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 还有其他区别吗?我应该什么时候使用它们?

【问题讨论】:

标签: go


【解决方案1】:

使用 Stmt 可以帮助您避免来自用户的 sql 注入。

来自wikipedia

准备好的语句可以抵御 SQL 注入,因为 参数值,稍后使用不同的方式传输 协议,不需要正确转义。如果原来的说法 模板不是从外部输入派生的,SQL注入不能 发生。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多