Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 12, 2012 20:01:33

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложный sql-запрос MySQLdb

Мой вопрос на примере (может он более подходит для темы 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)

Офлайн

#2 Дек. 12, 2012 21:24:23

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Сложный sql-запрос MySQLdb

Одним запросом - никак.
Запросы вы сделали верно.



Офлайн

#3 Дек. 12, 2012 22:21:16

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложный sql-запрос MySQLdb

Просто как на меня глючная немного эта библиотека.

Офлайн

#4 Дек. 13, 2012 09:19:37

sank
Зарегистрирован: 2012-10-05
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложный sql-запрос MySQLdb

Если хотите сэкономить на запросах, то можно построить уникальный ключ по 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}""")

Офлайн

#5 Дек. 13, 2012 14:51:12

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Сложный sql-запрос MySQLdb

sank
Замечательно.
Вы увеличили время обработки ситуации сервером в два раза.
Поздравляю! ;)



Офлайн

#6 Дек. 14, 2012 10:04:19

sank
Зарегистрирован: 2012-10-05
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложный sql-запрос MySQLdb

“время обработки ситуации сервером” - это что за характеристика сервера такая?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version