10.5.4 MySQLCursor.execute()方法

句法:

cursor.execute(operation, params=None, multi=False)
iterator = cursor.execute(operation, params=None, multi=True)

此方法执行给定的数据库 operation(查询或命令)。在元组或字典params中找到的参数绑定到操作中的变量。指定变量使用 %s或 参数样式(即使用或 样式)。如果是 ,则 返回一个迭代器。 %(name)sformatpyformatexecute()multiTrue

笔记

在 Python 中,包含单个值的元组必须包含逗号。例如,('abc')被评估为标量,而('abc',)被评估为元组。

此示例插入有关新员工的信息,然后选择该人员的数据。这些语句作为单独的execute()操作执行:

insert_stmt = (
  "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_stmt, data)

select_stmt = "SELECT * FROM employees WHERE emp_no = %(emp_no)s"
cursor.execute(select_stmt, { 'emp_no': 2 })

数据值根据需要从 Python 对象转换为 MySQL 可以理解的内容。在前面的示例中, datetime.date()实例被转换为 '2012-03-23'.

如果multi设置为Trueexecute()则能够执行operation字符串中指定的多个语句。它返回一个迭代器,可以处理每个语句的结果。但是,在这种情况下使用参数效果不佳,单独执行每个语句通常是个好主意。

以下示例在单个 execute()操作中选择和插入数据并显示每个语句的结果:

operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
for result in cursor.execute(operation, multi=True):
  if result.with_rows:
    print("Rows produced by statement '{}':".format(
      result.statement))
    print(result.fetchall())
  else:
    print("Number of rows affected by statement '{}': {}".format(
      result.statement, result.rowcount))

如果连接配置为获取警告,则操作生成的警告可通过 MySQLCursor.fetchwarnings() 方法获得。