使用预处理语句
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( 管理连接)。 |