Spec-Zone.ru › MySQL Connectors 1.0

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.
https://docs.oracle.com/cd/E17952_01/x-devapi-userguide-shell-python-en/parameter-binding.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API