Форум сайта python.su
0
Мой вопрос на примере (может он более подходит для темы SQL-запросов но все же):
есть две таблицы books_name (каталог книг) и author_name (список авторов книг), author_id обеех таблиц связаны
–books_name———-
book_name | author_id
—————————-
–author_name_list———–
author_id | author_name
——————————
есть файл с таблицей название_книги, автор книги (в разных названиях книг может быть один и тот же автор)
нужно сформировать запрос так чтобы проверялось внесено ли имя автора в таблицу author_name если не внесено то вносилос и связывалось author_id
Подскажите как сформировать запрос по добавлению даных за один sql-запрос
я бы сделал так
import MySQLdb def add_book(book_name, author_name): con = MySQLdb.connect(host='127.0.0.1', user='root', passwd='toor', db='books') con.autocommit(1) con.set_character_set('utf8') cur = con.cursor() cur.execute(""" SELECT `author_id` FROM `author_name_list` WHERE author_name = ('%(author_namey)s')% {'author_name':author_name}""") author_id_fetched = cur.fetchone() cur.close() if not author_id_fetched: cur = con.cursor() cur.execute(""" INSERT INTO `author_name_list` (`author_name`) VALUES ('%(author_name)s')% {'author_name':author_name}""") cur.close() author_id = str(con.insert_id()) else: author_id = author_id_fetched[0] cur = con.cursor() cur.execute(""" INSERT INTO `books_name` (`book_name`, `author_id`) VALUES ('%(book_name)s', '%(author_id)s')% {'author_name':author_name, 'author_id':author_id}""") cur.close() con.close()
Отредактировано agryn (Дек. 12, 2012 20:03:38)
Офлайн
33
Одним запросом - никак.
Запросы вы сделали верно.
Офлайн
0
Просто как на меня глючная немного эта библиотека.
Офлайн
0
Если хотите сэкономить на запросах, то можно построить уникальный ключ по author_name и убрать SELECT первый вообще. Потом без всяких ИФов тупо делать INSERT в авторов и обработать исключение дублирования author_name. По производительности будет почти тоже самое, что у вас.
А нижний INSERT сделать так наподобие такого:
INSERT INTO `books_name` (`book_name`, `author_id`) SELECT '%(book_name)s', author_id from `author_name_list` where author_name='%(author_name)s')% {'author_name':author_name, 'book_name':book_name}""")
Офлайн
33
sank
Замечательно.
Вы увеличили время обработки ситуации сервером в два раза.
Поздравляю! ;)
Офлайн
0
“время обработки ситуации сервером” - это что за характеристика сервера такая? 
Офлайн