最好不要在表达式字符串中直接使用值,而是将值与表达式字符串分开。这是使用表达式字符串中的参数和
bind()
将值绑定到参数的函数来完成的。
可以通过以下方式指定参数:匿名和命名。
参数类型 |
句法 |
例子 |
在 CRUD 操作中允许 |
在 SQL 字符串中允许 |
---|---|---|---|---|
匿名的 |
? |
'年龄 > ?' |
不 |
是的 |
命名的 |
:<名称> |
'年龄>:年龄' |
是的 |
不 |
以下示例显示如何在
bind()
函数之前使用
execute()
函数。对于每个命名参数,提供一个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()
使用一个名称值参数 for
的单个调用
: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
是不允许的。
bind()
除了用and execute()
or
直接绑定和执行 CRUD 操作之外,
execute()
还可以将 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()