使用预处理语句
3 分钟阅读
Using prepared statements - 使用预处理语句
您可以为重复使用定义一个预处理语句。这可以避免每次代码执行数据库操作时重新创建语句的开销,从而帮助代码更快地运行。
注意:预处理语句中的参数占位符根据您所使用的DBMS和驱动而不同。例如,Postgres的pq driver需要一个像$1这样的占位符,而不是?。
什么是预处理语句?
预处理语句是由DBMS解析并保存的SQL,通常包含占位符,但没有实际参数值。之后,可以用一组参数值来执行该语句。
您如何使用预处理语句
当您希望重复执行相同的SQL时,您可以使用一个sql.Stmt来提前准备SQL语句,然后根据需要执行它。
下面的例子创建了一个预处理语句,从数据库中选择一个特定的相册。DB.Prepare返回一个sql.Stmt,代表一个给定的SQL文本的预处理语句。您可以将SQL语句的参数传递给Stmt.Exec、Stmt.QueryRow或Stmt.Query来运行该语句。
| |
预处理语句的行为
一个准备好的sql.Stmt提供了常用的Exec、QueryRow和Query方法来调用其语句。关于使用这些方法的更多信息,请参阅Querying for data (查询数据) 和 Executing SQL statements that don’t return data(执行不返回数据的SQL语句)。
然而,由于一个sql.Stmt已经代表了一个预设的SQL语句,它的Exec、QueryRow和Query方法只接受与占位符对应的SQL参数值,而忽略了SQL文本。
您可以用不同的方式定义一个新的sql.Stmt,这取决于您将如何使用它。
DB.Prepare和DB.PrepareContext创建了一个预处理语句,该语句可以在事务外单独执行,就像DB.Exec和DB.Query一样。Tx.Prepare、Tx.PrepareContext、Tx.Stmt和Tx.StmtContext创建一个预处理语句,以便在一个特定的事务中使用。Prepare和PrepareContext使用SQL文本来定义语句。Stmt和StmtContext使用DB.Prepare或DB.PrepareContext的结果。也就是说,它们将一个非事务用的sql.Stmt转换为这个事务用的sql.Stmt。Conn.PrepareContext从一个代表保留连接的sql.Conn创建一个预处理语句。
一定要记住,在代码使用语句完成时,调用stmt.Close。这将释放任何可能与之相关的数据库资源(如底层连接)。对于只是一个函数中的局部变量的语句,defer stmt.Close()就足够了。
创建预处理语句的函数
| Function 函数 | Description 描述 |
|---|---|
DB.Prepare DB.PrepareContext | 准备独立执行的语句,或者使用 Tx.Stmt 将其转换为事务内准备的语句。 |
Tx.Prepare Tx.PrepareContext Tx.Stmt Tx.StmtContext | 准备一个在特定事务中使用的语句。更多信息,请参阅Executing transactions (执行事务) 。 |
Conn.PrepareContext | 用于保留连接。更多信息,请参见Managing connections( 管理连接)。 |