3.3 Привязка параметров
Вместо использования значений непосредственно в строке выражения, рекомендуется отделять значения от строки выражения. Это делается с помощью параметров в строке выражения и функции bind() для привязки значений к параметрам.
Параметры могут быть указаны следующими способами: безымянные и именованные.
Тип параметра | Синтаксис | Пример | Разрешено в операциях CRUD | Разрешено в строках SQL |
|---|---|---|---|---|
Безымянный | ? | 'age > ?' | нет | да |
Именованный | :<имя> | 'age > :age' | да | нет |
Следующий пример демонстрирует, как использовать функцию 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() с одним параметром имени и значения для :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
Вместо непосредственной привязки и выполнения операций CRUD с помощью bind() и execute() или 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()
© 2025 Oracle
Licensed under the GPLv2 License.