使用Borneo SDK时如何正确声明和使用SQL变量?
问题解决方案
1. Borneo SQL查询中正确声明和使用变量的方式
你当前的核心错误是在SQL语句中额外添加了DECLARE语句,并且绑定变量时带了$前缀。正确用法如下:
修正后的SQL语句
无需在SQL里声明变量,直接用$变量名作为占位符:
SELECT * FROM users WHERE mailaddress = $mailaddress AND nickname = $nickname
绑定变量的正确代码
绑定变量时,变量名不需要带$前缀:
# Set variables pstatement.set_variable('mailaddress', mailaddress) pstatement.set_variable('nickname', nickname)
完整修正后的代码片段
import logging from borneo import PrepareRequest, QueryRequest logging.getLogger().info("Starting the query execution") # 去掉DECLARE语句,直接使用变量占位符 statement = ''' SELECT * FROM users WHERE mailaddress = $mailaddress AND nickname = $nickname ''' logging.getLogger().info("Preparing the statement") prequest = PrepareRequest().set_statement(statement) try: presult = handle.prepare(prequest) logging.getLogger().info("Statement prepared") pstatement = presult.get_prepared_statement() logging.getLogger().info("Got the prepared statement") # 绑定变量时去掉$前缀 pstatement.set_variable('mailaddress', mailaddress) pstatement.set_variable('nickname', nickname) logging.getLogger().info("Set variables for the prepared statement") qrequest = QueryRequest().set_prepared_statement(pstatement) qiresult = handle.query_iterable(qrequest) userId = "" for row in qiresult: logging.getLogger().info(row) userId = row["userId"] break except Exception as e: logging.getLogger().error("Error occurred: %s", str(e)) if not qiresult: logging.getLogger().info("No results found or query execution failed")
2. Borneo变量的语法规则与最佳实践
- 变量命名规则:SQL中使用变量时必须以
$开头,绑定变量时则去掉$前缀;变量名需符合标识符规范,不能包含特殊字符(除开头的$)。 - 无需DECLARE声明:Borneo会自动根据绑定的值推断变量类型,不需要在SQL中提前声明变量类型。如果需要强制指定类型,可以在绑定变量时传入类型定义:
from borneo import FieldDef, FieldType pstatement.set_variable('mailaddress', mailaddress, FieldDef().set_type(FieldType.STRING)) - 优先使用PreparedStatement:绑定变量可以避免SQL注入风险,同时提升重复执行查询的效率。
- 批量绑定变量:如果有多个变量,可以用
set_variables方法批量传入字典,简化代码:pstatement.set_variables({'mailaddress': mailaddress, 'nickname': nickname}) - 变量作用域:每个PreparedStatement的变量仅对当前语句生效,不同语句的变量相互独立。
内容的提问来源于stack exchange,提问作者kuruwi
相关产品推荐
相关产品推荐

