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

22.6.4.2. Создание Таблиц Используя Соединитель/Python

Весь DDL (Язык определения данных) операторы выполняется, используя структуру дескриптора, известную как курсор. Следующие примеры показывают, как составить таблицы Базы данных-образца Сотрудника. Вы нуждаетесь в них для других примеров.

В сервере MySQL таблицы являются очень долговечными объектами, и часто получаются доступ многократными приложениями, записанными на различных языках. Вы могли бы обычно работать с таблицами, которые уже устанавливаются, вместо того, чтобы создать их в пределах Вашего собственного приложения. Избегите устанавливать и отбрасывать таблицы много раз, поскольку это - дорогая работа. Исключение является временными таблицами, которые могут быть созданы и отброшены быстро в пределах приложения.

from __future__ import print_functionimport mysql.connectorfrom mysql.connector import errorcodeDB_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,"    "  PRIMARY KEY (`emp_no`)"    ") ENGINE=InnoDB")TABLES['departments'] = (    "CREATE TABLE `departments` ("    "  `dept_no` char(4) NOT NULL,"    "  `dept_name` varchar(40) NOT NULL,"    "  PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name` (`dept_name`)"    ") ENGINE=InnoDB")TABLES['salaries'] = (    "CREATE TABLE `salaries` ("    "  `emp_no` int(11) NOT NULL,"    "  `salary` int(11) NOT NULL,"    "  `from_date` date NOT NULL,"    "  `to_date` date NOT NULL,"    "  PRIMARY KEY (`emp_no`,`from_date`), KEY `emp_no` (`emp_no`),"    "  CONSTRAINT `salaries_ibfk_1` FOREIGN KEY (`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,"    "  PRIMARY KEY (`emp_no`,`dept_no`), KEY `emp_no` (`emp_no`),"    "  KEY `dept_no` (`dept_no`),"    "  CONSTRAINT `dept_emp_ibfk_1` FOREIGN KEY (`emp_no`) "    "     REFERENCES `employees` (`emp_no`) ON DELETE CASCADE,"    "  CONSTRAINT `dept_emp_ibfk_2` FOREIGN KEY (`dept_no`) "    "     REFERENCES `departments` (`dept_no`) ON DELETE CASCADE"    ") ENGINE=InnoDB")TABLES['dept_manager'] = (    "  CREATE TABLE `dept_manager` ("    "  `dept_no` char(4) NOT NULL,"    "  `emp_no` int(11) NOT NULL,"    "  `from_date` date NOT NULL,"    "  `to_date` date NOT NULL,"    "  PRIMARY KEY (`emp_no`,`dept_no`),"    "  KEY `emp_no` (`emp_no`),"    "  KEY `dept_no` (`dept_no`),"    "  CONSTRAINT `dept_manager_ibfk_1` FOREIGN KEY (`emp_no`) "    "     REFERENCES `employees` (`emp_no`) ON DELETE CASCADE,"    "  CONSTRAINT `dept_manager_ibfk_2` FOREIGN KEY (`dept_no`) "    "     REFERENCES `departments` (`dept_no`) ON DELETE CASCADE"    ") ENGINE=InnoDB")TABLES['titles'] = (    "CREATE TABLE `titles` ("    "  `emp_no` int(11) NOT NULL,"    "  `title` varchar(50) NOT NULL,"    "  `from_date` date NOT NULL,"    "  `to_date` date DEFAULT NULL,"    "  PRIMARY KEY (`emp_no`,`title`,`from_date`), KEY `emp_no` (`emp_no`),"    "  CONSTRAINT `titles_ibfk_1` FOREIGN KEY (`emp_no`)"    "     REFERENCES `employees` (`emp_no`) ON DELETE CASCADE"    ") ENGINE=InnoDB")

Предыдущий код показывает, как мы храним CREATE операторы в словаре Python вызывают TABLES. Мы также определяем базу данных в вызванной глобальной переменной DB_NAME, который позволяет Вам легко использовать различную схему.

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

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

def create_database(cursor):    try:        cursor.execute(            "CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8'".format(DB_NAME))    except mysql.connector.Error as err:        print("Failed creating database: {}".format(err))        exit(1)try:    cnx.database = DB_NAME    except mysql.connector.Error as err:    if err.errno == errorcode.ER_BAD_DB_ERROR:        create_database(cursor)        cnx.database = DB_NAME    else:        print(err)        exit(1)

Мы сначала пытаемся измениться на определенную базу данных, используя database свойство объекта соединения cnx. Если есть ошибка, мы исследуем код ошибки, чтобы проверить, не существует ли база данных. Если так, мы вызываем create_database функция, чтобы создать это для нас.

На любой другой ошибке приложение выходит и выводит на экран сообщение об ошибке.

После того, как мы успешно создаем или изменяемся на целевую базу данных, мы составляем таблицы, выполняя итерации по элементам TABLES словарь:

for name, ddl in TABLES.iteritems():    try:        print("Creating table {}: ".format(name), end='')        cursor.execute(ddl)    except mysql.connector.Error as err:        if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:            print("already exists.")        else:            print(err.errmsg)    else:        print("OK")cursor.close()cnx.close()

Чтобы обработать ошибку, когда таблица уже существует, мы уведомляем пользователя, что это уже было там. Другие ошибки печатаются, но мы продолжаем составлять таблицы. (Шоу в качестве примера, как обработать "таблицу уже, существуют" условие в целях иллюстрации. В реальном приложении мы обычно избегали бы состояния ошибки полностью при использовании IF NOT EXISTS пункт CREATE TABLE оператор.)

Вывод был бы чем-то вроде этого:

Creating table employees: already exists.Creating table salaries: already exists.Creating table titles: OKCreating table departments: already exists.Creating table dept_manager: already exists.Creating table dept_emp: already exists.

Чтобы заполнить таблицы сотрудников, используйте файлы дампа Базы данных-образца Сотрудника. Отметьте, что Вы только нуждаетесь в файлах дампа данных, как которые Вы найдете в архиве названный employees_db-dump-files-1.0.5.tar.bz2. После загрузки файлов дампа выполните следующие команды, добавляя опции соединения к mysql командам в случае необходимости:

shell> tar xzf
        employees_db-dump-files-1.0.5.tar.bz2shell> cd
        employees_dbshell> mysql employees <
        load_employees.dumpshell> mysql employees <
        load_titles.dumpshell> mysql employees <
        load_departments.dumpshell> mysql employees <
        load_salaries.dumpshell> mysql employees <
        load_dept_emp.dumpshell> mysql employees <
        load_dept_manager.dump