Найти - Пользователи
Полная версия: Сложный sql-запрос MySQLdb
Начало » Python для новичков » Сложный sql-запрос MySQLdb
1
agryn
Мой вопрос на примере (может он более подходит для темы 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()
А как правильно?
Lexander
Одним запросом - никак.
Запросы вы сделали верно.
agryn
Просто как на меня глючная немного эта библиотека.
sank
Если хотите сэкономить на запросах, то можно построить уникальный ключ по 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}""")
Lexander
sank
Замечательно.
Вы увеличили время обработки ситуации сервером в два раза.
Поздравляю! ;)
sank
“время обработки ситуации сервером” - это что за характеристика сервера такая?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB