Spec-Zone .ru
спецификации, руководства, описания, API
|
Весь 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.bz2
shell>cd employees_db
shell>mysql employees < load_employees.dump
shell>mysql employees < load_titles.dump
shell>mysql employees < load_departments.dump
shell>mysql employees < load_salaries.dump
shell>mysql employees < load_dept_emp.dump
shell>mysql employees < load_dept_manager.dump