You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:43