3.3 参数绑定

不要直接在表达式字符串中使用值,而是将值与表达式字符串分离。这可以通过在表达式字符串中使用参数和使用 bind() 函数将值绑定到参数来实现。

参数可以通过以下方式指定:匿名和命名。

参数类型

语法

示例

允许在 CRUD 操作中使用

允许在 SQL 字符串中使用

匿名

?

'age > ?'

命名

:<name>

'age > :age'

以下示例展示了如何在 execute() 函数之前使用 bind() 函数。对于每个命名参数,请向 bind() 提供一个参数,该参数包含参数名称及其值。将参数值对传递到 bind() 的顺序无关紧要。该示例假设 test 模式已分配给变量 db 并且集合 my_collection 存在。

# Collection.find() function with hardcoded values
myColl = db.get_collection('my_collection')

myRes1 = myColl.find('age = 18').execute()

# Using the .bind() function to bind parameters
myRes2 = myColl.find('name = :param1 AND age = :param2').bind('param1','Rohit').bind('param2', 18).execute()

# Using named parameters
myColl.modify('name = :param').set('age', 55).bind('param', 'Nadya').execute()

# Binding works for all CRUD statements except add()
myRes3 = myColl.find('name like :param').bind('param', 'R%').execute()

X DevAPI 不支持匿名占位符。此限制提高了使用占位符的具有多个方法的 CRUD 命令链的代码清晰度。无论使用哪种 bind() 语法变体,总是根据参数名称在参数和占位符之间存在明确的关联。

CRUD 命令链的所有方法都形成一个用于占位符的命名空间。在以下示例中,modify()set() 是链式的。两种方法都使用带占位符的表达式。占位符引用一个组合的命名空间。两者都使用一个名为 :param 的占位符。对 bind() 的单个调用,带有一个名为 :param 的名称值参数,用于将占位符值分配给链式方法中的 :param 的两次出现.

# one bind() per parameter
myColl = db.get_collection('relatives')
juniors = myColl.find('alias = "jr"').execute().fetch_all()

for junior in juniors:
  myColl.modify('name = :param'). \
    set('parent_name',mysqlx.expr(':param')). \
    bind('param', junior.name).execute()

不允许命名参数使用以数字开头的名称。例如,:1one:1 不允许。

准备 CRUD 语句

除了直接使用 bind()execute()execute() 绑定和执行 CRUD 操作之外,还可以将 CRUD 操作对象存储在变量中以供以后执行。

这样做的好处是可以将多个变量集绑定到表达式字符串中定义的参数,从而在执行大量类似操作时获得更好的性能。该示例假设 test 模式已分配给变量 db 并且集合 my_collection 存在。

myColl = db.get_collection('my_collection')

# Only prepare a Collection.remove() operation, but do not run it yet
myRemove = myColl.remove('name = :param1 AND age = :param2')

# Binding parameters to the prepared function and .execute()
myRemove.bind('param1', 'Leon').bind('param2', 39).execute()
myRemove.bind('param1', 'Johannes').bind('param2', 28).execute()

# Binding works for all CRUD statements but add()
myFind = myColl.find('name like :param1 AND age > :param2')

myDocs = myFind.bind('param1', 'L%').bind('param2', 20).execute()
MyOtherDocs = myFind.bind('param1', 'J%').bind('param2', 25).execute()