MySQL Connector/Python 开发者指南  /  Connector/Python 代码示例  /  使用 Connector/Python 插入数据

5.3 使用 Connector/Python 插入数据

插入或更新数据也是使用称为游标的处理程序结构完成的。 当您使用事务性存储引擎(例如 InnoDB(MySQL 5.5 及更高版本中的默认引擎))时,您必须在执行一系列 INSERTDELETEUPDATE 语句之后提交数据。

本示例演示如何插入新数据。 第二个 INSERT 语句取决于第一个语句新创建的 主键 的值。 该示例还演示了如何使用扩展格式。 任务是添加一名明天开始工作的新员工,工资设定为 50000。

注意

以下示例使用在示例 第 5.2 节 “使用 Connector/Python 创建表” 中创建的表。 employees 表的主键的 AUTO_INCREMENT 列选项对于确保可靠、易于搜索的数据非常重要。

from __future__ import print_function
from datetime import date, datetime, timedelta
import mysql.connector

cnx = mysql.connector.connect(user='scott', database='employees')
cursor = cnx.cursor()

tomorrow = datetime.now().date() + timedelta(days=1)

add_employee = ("INSERT INTO employees "
               "(first_name, last_name, hire_date, gender, birth_date) "
               "VALUES (%s, %s, %s, %s, %s)")
add_salary = ("INSERT INTO salaries "
              "(emp_no, salary, from_date, to_date) "
              "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")

data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))

# Insert new employee
cursor.execute(add_employee, data_employee)
emp_no = cursor.lastrowid

# Insert salary information
data_salary = {
  'emp_no': emp_no,
  'salary': 50000,
  'from_date': tomorrow,
  'to_date': date(9999, 1, 1),
}
cursor.execute(add_salary, data_salary)

# Make sure data is committed to the database
cnx.commit()

cursor.close()
cnx.close()

我们首先打开与 MySQL 服务器的连接,并将 连接对象 存储在变量 cnx 中。 然后,我们使用连接的 cursor() 方法创建一个新的游标,默认情况下是一个 MySQLCursor 对象。

我们可以通过调用数据库函数来计算明天,但为了清楚起见,我们使用 Python 中的 datetime 模块来完成。

两个 INSERT 语句都存储在名为 add_employeeadd_salary 的变量中。 请注意,第二个 INSERT 语句使用扩展的 Python 格式代码。

新员工的信息存储在元组 data_employee 中。 执行插入新员工的查询,并使用游标对象的 lastrowid 属性检索新插入的 emp_no 列(AUTO_INCREMENT 列)的值。

接下来,我们使用包含数据的字典中的 emp_no 变量为新员工插入新工资。 如果发生错误,则将此字典传递给游标对象的 execute() 方法。

由于默认情况下 Connector/Python 会关闭 自动提交,并且 MySQL 5.5 及更高版本默认使用事务性 InnoDB 表,因此您需要使用连接的 commit() 方法提交更改。 您也可以使用 rollback() 方法回滚