На этом шаге мы рассмотрим методы, используемые для реализации этой операции.
После подключения к базе данных необходимо с помощью метода cursor () создать объект-курсор. Для выполнения запроса к базе данных предназначены следующие методы объекта-курсора:
import pyodbc s = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=localhost;" s += "UID=root;DATABASE=python;CHARSET=utf8" con = pyodbc.connect(s, autocommit=True, unicode_results=True) cur = con.cursor() sql_1 = """\ CREATE TABLE `user` ( `id_user` INT AUTO_INCREMENT PRIMARY KEY, `email` VARCHAR(255), `passw` VARCHAR(255) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci """ sql_2 = """\ CREATE TABLE `rubr` ( `id_rubr` INT AUTO_INCREMENT PRIMARY KEY, `name_rubr` VARCHAR(255) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci """ sql_3 = """\ CREATE TABLE `site` ( `id_site` INT AUTO_INCREMENT PRIMARY KEY, `id_user` INT, `id_rubr` INT, `url` VARCHAR(255), `title` VARCHAR(255), `msg` TEXT, `iq` INT ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci """ try: cur.execute(sql_1) cur.execute(sql_2) cur.execute(sql_3) except pyodbc.Error as err: print("Ошибка:", err) else: print("Запрос успешно выполнен") cur.close() con.close() input()
Если данные получены от пользователя, то подставлять их в SQL-запрос необходимо через второй параметр метода execute (). В этом случае данные проходят обработку и все специальные символы экранируются. Если подставить в SQL-запрос необработанные данные, то пользователь получит возможность видоизменить запрос и, например, зайти в закрытый раздел без ввода пароля. В SQL-запросе место вставки обработанных данных помечается с помощью символа ?, а сами данные передаются в виде кортежа во втором параметре метода execute (). Их также можно передать как обычные параметры этого метода. Для примера заполним таблицу с рубриками и добавим нового пользователя:
import pyodbc s = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=localhost;" s += "UID=root;DATABASE=python;CHARSET=utf8" con = pyodbc.connect(s, autocommit=True, unicode_results=True) cur = con.cursor() sql_1 = "INSERT INTO `user` (`email`, `passw`) VALUES (?, ?)" sql_2 = "INSERT INTO `rubr` (`name_rubr`) VALUES (?)" sql_3 = "INSERT INTO `rubr` VALUES (NULL, ?)" try: cur.execute(sql_1, ('unicross@mail.ru', 'passwordl') ) cur.execute(sql_2, ("Программирование",)) cur.execute(sql_3, """Поисковые ' " порталы""") except pyodbc.Error as err: print("Ошибка:", err) else: print("Запрос успешно выполнен") cur.close() con.close() input()
import pyodbc s = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=localhost;" s += "UID=root;DATABASE=python;CHARSET=utf8" con = pyodbc.connect(s, autocommit=True, unicode_results=True) cur = con.cursor() arr = [ (1, 1, "http://www.admin.ru", "Название", "", 100), (1, 1, "http://python.org", "Python", "", 1000), (1, 2, "http://google.ru", "Гугль", "", 3000) ] sql = """INSERT INTO `site` \ (`id_user`, `id_rubr`, `url`, `title`, `msg`, `iq`) \ VALUES (?, ?, ?, ?, ?, ?)""" try: cur.executemany(sql, arr) except pyodbc.Error as err: print("Ошибка:", err) else: print("Запрос успешно выполнен") cur.close() con.close() input()
На следующем шаге мы рассмотрим обработку результата запроса.