2016-09-19 114 views
0

喜数据库/ SQL包我可以以两种方式执行查询:我应该在数据库查询中使用Sql.Stmt还是字符串?

  • 第一种方式:用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

[Go sql - 准备语句作用域]的相关/可能的重复(http://stackoverflow.com/questions/38390999/go-sql-prepared-statement-scope)。 – icza

+0

'INSERT ... RETURNING ...'如果使用'tx.QueryRow()'支持' –

回答

1

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

wikipedia

预处理语句是针对SQL注入弹性的,因为 参数值,这些值使用不同的协议 以后所发送,不需要被正确转义。如果原始语句 模板不是从外部输入派生的,则SQL注入不能发生 。

相关问题