Spec-Zone .ru
спецификации, руководства, описания, API

22.6.7.4. Класс cursor.MySQLCursor

MySQLCursor class используется, чтобы инстанцировать объектов, которые могут выполнить операции, такие как SQL-запросы. Они взаимодействуют с сервером MySQL, используя a MySQLConnection объект.

22.6.7.4.1. Конструктор cursor.MySQLCursor

Конструктор инициализирует экземпляр с дополнительным connection, который должен быть экземпляром MySQLConnection.

В большинстве случаев, MySQLConnection cursor() метод используется, чтобы инстанцировать a MySQLCursor объект.

22.6.7.4.2. Метод MySQLCursor.callproc(procname, args=())

Это вызовы метода хранимая процедура с именем. args последовательность параметров должна содержать одну запись для каждого параметра, что подпрограмма ожидает. Результат возвращается как измененная копия входной последовательности. Входные параметры оставляют нетронутыми. Вывод и параметры ввода/вывода могут быть заменены новыми значениями.

Наборы результатов, произведенные хранимой процедурой, автоматически выбираются и сохранены как экземпляры MySQLBufferedCursor. Для получения дополнительной информации см. stored_results ().

Следующий пример показывает, как выполнить хранимую процедуру, которая берет два параметра, умножает значения и возвращает продукт:

# Definition of the multiply stored procedure:# CREATE PROCEDURE multiply(IN pFac1 INT, IN pFac2 INT, OUT pProd INT)# BEGIN#  SET pProd := pFac1 * pFac2;# END>>> args = (5, 5, 0) # 0 is to hold value of the OUT parameter pProd>>> cursor.callproc('multiply', args)('5', '5', 25L)

22.6.7.4.3. Метод MySQLCursor.close()

Этот метод закрывает курсор MySQL, сбрасывая все результаты, и удостоверьтесь, что у объекта курсора нет никакой ссылки на объект соединения.

Использовать close() каждый раз Вы делаетесь, используя курсор.

22.6.7.4.4. Метод MySQLCursor.execute(operation, params=None,multi=False)

Этот метод готовит данную базу данных operation (запрос или команда). Параметры, найденные в кортеже или словаре params связываются с переменными в работе. Переменные определяются, используя %s формат маркера или %(name) формат именованного маркера.

Этот пример вставляет информацию о новом сотруднике, затем выбирает данные для этого человека:

insert = ("INSERT INTO employees (emp_no, first_name, last_name, hire_date) ""VALUES (%s, %s, %s, %s)")data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23))cursor.execute(insert, data)select = "SELECT * FROM employees WHERE emp_no = %(emp_no)s"cursor.execute(select, { 'emp_no': 2 })

Отметьте, что значения данных преобразовываются, поскольку necessar от Python возражает против чего-то, что MySQL понимает. В предыдущем примере, datetime.date() экземпляр преобразовывается в '2012-03-23'.

Когда multi устанавливается в True, execute() в состоянии выполнить многократные операторы. Это возвращает iterator, который позволяет обработать результаты для каждого оператора. Отметьте, что использование параметров не работает хорошо в этом случае, и это обычно - хорошая идея выполнить каждый оператор самостоятельно.

Следующий пример выбирает и вставляет данные в одну работу и выводит на экран результат:

operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'for result in cursor.execute(operation):  if result.with_rows:    print("Statement '{}' has following rows:".format(      result.statement))    print(result.fetchall())  else:    print("Affected row(s) by query '{}' was {}".format(      result.statement, result.rowcount))

Если соединение было сконфигурировано, чтобы выбрать предупреждения, предупреждения, сгенерированные работой, доступны через MySQLCursor.fetchwarnings () метод.

Возвращает iterator когда multi True.

22.6.7.4.5. Метод MySQLCursor.executemany(operation, seq_params)

Этот метод готовит работу базы данных (запрос или команда) и затем выполняет это против всех последовательностей параметра или отображений, найденных в последовательности seq_of_params.

executemany() выполняет итерации через последовательность параметров, вызывая execute() метод. Вставка данных, однако, оптимизируется, обрабатывая их в пакетном режиме использующий синтаксис multipler-строки.

Следующий пример вставляет три записи:

data = [  ('Jane', date(2005, 2, 12)),  ('Joe', date(2006, 5, 23)),  ('John', date(2010, 10, 3)),]stmt = "INSERT INTO employees (first_name, hire_date) VALUES (%s, %s)"cursor.executemany(stmt, data)

В предыдущем примере, INSERT оператор, отправленный MySQL, был бы:

INSERT INTO employees (first_name, hire_date)VALUES ('Jane', '2005-02-12'), ('Joe', '2006-05-23'), ('John', '2010-10-03')

Tt не возможен выполнить многократные операторы, используя executemany() метод. Выполнение так повышения InternalError исключение.

22.6.7.4.6. Метод MySQLCursor.fetchall()

Метод выбирает все или остающиеся строки набора результатов запроса, возвращая список кортежей. Когда больше строк не доступно, это возвращает пустой список.

Следующий пример показывает, как получить первые две строки набора результатов, и затем получить остающиеся строки:

>>> cursor.execute("SELECT * FROM employees ORDER BY emp_no")>>> head_rows = cursor.fetchmany(size=2)>>> remaining_rows = cursor.fetchall()

Следует выбрать все строки перед возможностью выполнить новые запросы, используя то же самое соединение.

22.6.7.4.7. Метод MySQLCursor.fetchmany(size=1)

Этот метод выбирает следующий набор строк результата запроса, возвращая список кортежей. Когда больше строк не доступно, это возвращает пустой список.

Число возвращенных строк может быть определено, используя параметр размера, который значения по умолчанию одному. Меньше строк могло бы быть возвращено, когда нет большего количества строк, доступных чем указанный параметром.

Отметьте, что следует выбрать все строки перед возможностью выполнить новые запросы, используя то же самое соединение.

22.6.7.4.8. Метод MySQLCursor.fetchone()

Этот метод получает следующую строку набора результатов запроса, возвращая единственную последовательность, или None когда больше строк не доступно. Возвращенный кортеж состоит из данных, возвращенных сервером MySQL, преобразованным в объекты Python.

fetchone() метод используется fetchmany () и fetchall (). Это также используется при использовании MySQLCursor экземпляр как iterator.

Следующий пример показывает, как использовать fetchone() обработать результат запроса, сначала используя a while цикл, затем используя iterator:

# Using a while-loopcursor.execute("SELECT * FROM employees")row = cursor.fetchone()while row is not None:  print(row)  row = cursor.fetchone()# Using the cursor as iterator cursor.execute("SELECT * FROM employees")for row in cursor:  print(row)

Следует выбрать все строки перед возможностью выполнить новые запросы, используя то же самое соединение.

22.6.7.4.9. Метод MySQLCursor.fetchwarnings()

Этот метод возвращает список кортежей, содержащих предупреждения, сгенерированные ранее выполняемым оператором. Используйте соединение get_warnings свойство, чтобы установить, состоят ли предупреждения в том, чтобы быть выбраны.

Следующий пример показывает a SELECT оператор, который генерировал предупреждение:

>>> cnx.get_warnings = True>>> cursor.execute('SELECT "a"+1')>>> cursor.fetchall()[(1.0,)]>>> cursor.fetchwarnings()[(u'Warning', 1292, u"Truncated incorrect DOUBLE value: 'a'")]

Также возможно повысить ошибки, когда предупреждения находятся. См. MySQLConnection свойство raise_on_warnings.

22.6.7.4.10. Метод MySQLCursor.stored_results()

Этот метод возвращает список iterator объект, который может использоваться, чтобы обработать наборы результатов, произведенные хранимой процедурой после вызова его использующий callproc () метод.

Следующий пример выполняет хранимую процедуру, которая производит два набора результатов, затем использует stored_results() получать их:

>>> cursor.callproc('sp1')()>>> for result in cursor.stored_results():...     print result.fetchall()... [(1,)][(2,)]

Наборы результатов остаются доступными, пока Вы не выполняете другую работу или вызываете другую хранимую процедуру.

22.6.7.4.11. Свойство MySQLCursor.column_names

Это свойство только для чтения возвращает имена столбцов набора результатов как последовательность (Unicode) строки.

Следующий пример показывает, как создать словарь из кортежа, содержащего данные с ключевым использованием column_names:

cursor.execute("SELECT last_name, first_name, hire_date "  "FROM employees WHERE emp_no = %s", (123,))row = dict(zip(cursor.column_names, cursor.fetchone())print("{last_name}, {first_name}: {hire_date}".format(row))

22.6.7.4.12. Свойство MySQLCursor.lastrowid

Это свойство только для чтения возвращает ID строки последней измененной строки. Например, если Вы выполняете INSERT в таблицу, которая содержит AUTO_INCREMENT столбец, lastrowid возвраты AUTO_INCREMENT значение для новой строки. Для примера см. Раздел 22.6.4.3, "Вставка Данных Используя Соединитель/Python".

22.6.7.4.13. Свойство MySQLCursor.statement

Это свойство только для чтения возвращает последний выполняемый оператор как строку. Строка может содержать многократные операторы, если строка многократного оператора выполнялась.

statement свойство может быть полезным для отладки и отображения, что было отправлено серверу MySQL.

22.6.7.4.14. Свойство MySQLCursor.with_rows

Это свойство только для чтения возвраты True когда результат выполняемой работы обеспечивает строки.

with_rows свойство полезно, когда необходимо определить, производит ли оператор набор результатов, и Вы должны выбрать строки. Следующий пример получает строки, возвращенные SELECT оператор, но отчеты только влиявшие строки оценивают за UPDATE оператор:

import mysql.connectorcnx = mysql.connector.connect(user='scott', database='test')cursor = cnx.cursor()operation = 'SELECT 1; UPDATE t1 SET c1 = 2; SELECT 2'for result in cursor.execute(operation, multi=True):  if result.with_rows:    result.fetchall()  else:print("Updated row(s): {}".format(result.rowcount))