5.2使用Connector/Python创建表

所有DDL(数据定义语言)语句使用称为游标的句柄结构执行。类的表,下面的示例演示如何创建员工示例数据库.在其他例子中你需要它们。

在MySQL服务器中,表是非常长寿的对象,并且经常被用不同语言编写的多个应用程序访问。通常,您可能会使用已经设置好的表,而不是在自己的应用程序中创建它们。避免一遍又一遍地设置和删除表,因为这是一项昂贵的操作。唯一的例外是临时表,可以在应用程序中快速创建和删除。

从__future__导入print_function导入mysql。从mysql连接器。connector import errorcode DB_NAME = 'employees' TABLES = {} TABLES['employees'] = (" CREATE TABLE 'employees' (" " ' emp_no ' int(11) NOT NULL AUTO_INCREMENT," " ' birth_date ' date NOT NULL," " ' first_name ' varchar(14) NOT NULL," " ' last_name ' varchar(16) NOT NULL," " ' gender ' enum('M','F') NOT NULL," " ' hire_date ' date NOT NULL," "主键(' emp_no ') "")引擎=InnoDB") TABLES['departments'] = (" CREATE TABLE 'departments' (" " ' dept_no ' char(4) NOT NULL," " ' dept_name ' varchar(40) NOT NULL," "主键(' dept_no '),唯一键' dept_name ' (' dept_name ')"") ENGINE=InnoDB") TABLES[' employees '] = (" CREATE TABLE ' employees ' (" " ' emp_no ' int(11) NOT NULL," " ' from_date ' date NOT NULL," " to_date ' date NOT NULL," "主键(' emp_no ', ' from_date '),键' emp_no ' (' emp_no ')," " CONSTRAINT ' salaries_ibfk_1 '外键(' emp_no ')" " REFERENCES ' employees ' (' emp_no ') ON DELETE CASCADE" ") ENGINE=InnoDB") TABLES['dept_emp'] = (" CREATE TABLE 'dept_emp' (" " ' emp_no ' int(11) NOT NULL," " ' dept_no ' char(4) NOT NULL," " ' from_date ' date NOT NULL," " to_date ' date NOT NULL ","主键(' emp_no ', ' dept_no '),键' emp_no ' (' dept_no '),"约束' dept_emp_ibfk_1 '外键(' emp_no ') ""引用' employees ' (' emp_no ') ON DELETE CASCADE," "约束' dept_emp_ibfk_2 '外键(' dept_no ') "" " REFERENCES ' departments ' (' dept_no ') ON DELETE CASCADE" ") ENGINE=InnoDB") TABLES['dept_manager'] = (" CREATE TABLE 'dept_manager' (" " ' emp_no ' int(11) NOT NULL," " ' dept_no ' char(4) NOT NULL," " ' from_date ' date NOT NULL," " to_date ' date NOT NULL ","主键(' emp_no ', ' dept_no ')," KEY ' emp_no ' (' dept_no ')," CONSTRAINT ' dept_manager_ibfk_1 '外键(' emp_no ') ""引用' employees ' (' emp_no ') ON DELETE CASCADE," "约束' dept_manager_ibfk_2 '外键(' dept_no ') "" "引用' departments ' (' dept_no ') ON DELETE CASCADE" ") ENGINE=InnoDB") TABLES['标题']= (" CREATE TABLE '标题' int(11) NOT NULL," " '标题' varchar(50) NOT NULL," " from_date ' date NOT NULL," " to_date ' date DEFAULT NULL," "主键(' emp_no ', '标题',' from_date '),键' emp_no ' (' emp_no '),"约束' titles_ibfk_1 '外键(' emp_no ')" "引用' employees ' (' emp_no ') ON DELETE CASCADE" ")

上面的代码显示了如何存储创建语句在Python字典中的.我们还在一个全局变量中定义数据库DB_NAME,这使您能够轻松地使用不同的模式。

CNX = mysql.connector.connect(user='scott') cursor = CNX .cursor()

一个MySQL服务器可以管理多个数据库.通常,在连接到MySQL服务器时指定要切换到的数据库。此示例在连接时不连接到数据库,因此它可以确保数据库存在,如果不存在则创建数据库:

Def create_database(游标):try:游标。除了mysql.connector.Error as err: print("Failed creating DATABASE: {}".format(err)) exit(1) try: cursor. execute("CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8'".format(DB_NAME))如果mysql.connector.Error as err: print("Database {} does not exists.".format(DB_NAME))errno = =错误代码。ER_BAD_DB_ERROR: create_database(cursor) print("Database {} created successfully.".format(DB_NAME))database = DB_NAME else: print(err) exit(1)

方法更改到特定的数据库数据库属性cnx.如果有错误,我们检查错误号以检查数据库是否不存在。如果是,我们调用create_database函数为我们创建它。

对于任何其他错误,应用程序退出并显示错误消息。

在成功创建或更改目标数据库之后,通过迭代字典:

for table_name in TABLES: table_description = TABLES[table_name] try: print("Creating table {}: ".format(table_name), end= ") cursor.execute(table_description) except mysql.connector.Error as err: iferrno = =错误代码。ER_TABLE_EXISTS_ERROR: print("already exists.") else: print(err.msg) else: print("OK") cursor.close()

要处理表已经存在时的错误,我们通知用户表已经存在。打印其他错误,但我们继续创建表。该示例展示了如何处理表已经存在说明条件。在实际的应用程序中,我们通常会通过使用如果不存在条款的创建表声明。)

输出结果如下所示:

数据库雇员不存在。数据库员工创建成功。创建表雇员:OK创建表部门:已经存在。创建表工资:已经存在。创建表dept_emp: OK创建表dept_manager: OK创建表标题:OK

类的转储文件来填充employees表员工示例数据库.注意,您只需要数据转储文件,您将在名为employees_db-dump-files-1.0.5.tar.bz2.下载转储文件后,执行以下命令,将连接选项添加到mysql如果有必要的命令:

$> tar XZF employees_db-dump-files-1.0.5.tar. gz。Bz2 $> CD employees_db $> mysql employees < load_employees。转储$> mysql employees < load_title。Dump $> mysql employees < load_departments。转储$> mysql employees < load_wages。Dump $> mysql employees < load_dept_empDump mysql employees < load_dept_manager.dump