duanqu9292 2016-09-19 11:49
浏览 60
已采纳

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

Hi in database/sql package I can execute a query in two ways:

  • First way: using 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)
    
  • Second way: using string

    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)
    

The only difference That I know that its is not possible to use sql.Stmt when you are returning something for example Insert Into FOO(f1,f2,f3) Values(v1,v2,v3) returning f_id Is there any other differences? and when should I use each one?

  • 写回答

1条回答 默认 最新

  • dpzlz08480 2016-09-26 23:11
    关注

    Using the Stmt helps you avoid sql injection from the user.

    From wikipedia:

    Prepared statements are resilient against SQL injection, because parameter values, which are transmitted later using a different protocol, need not be correctly escaped. If the original statement template is not derived from external input, SQL injection cannot occur.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测