Выполнение разных запросов с использованием mysql-python - PullRequest
5 голосов
/ 11 ноября 2011

Я работаю с удаленной базой данных для импорта данных в базу данных моего Django-проекта.

С помощью MySQLdb Мне удалось легко создать функцию импорта, подобную следующей:

def connect_and_get_data(useful_string):
    CONNECTION = MySQLdb.connect(host=..., port=...,
                                 user=..., passwd=..., db=...,
                                 cursorclass=MySQLdb.cursors.DictCursor,
                                 charset = "utf8")
    cursor = CONNECTION.cursor()
    cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", (useful_string))
    result = cursor.fetchall()
    cursor.close()

Очень доволен этим, работает как положено.

Но, продолжая с кодом, я заметил, что иногда мне нужно снова подключаться к БД, чтобы выполнитьдругие разные запросы.

Первая идея была для меня вполне логичной: для каждого запроса мне нужно определить функцию, которая вызывает connect_and_get_data с заданным запросом в качестве параметра ... что-то вроде этого:

def get_data_about_first_amazing_topic(useful_string):
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" %(useful_string)
    connect_and_get_data(query)
    ...

def get_data_about_second_amazing_topic(other_useful_string):
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" %(other_useful_string)
    connect_and_get_data(query)
    ...

с этими модификациями connect_and_get_data:

def connect_and_get_data(query):
    ...
    cursor.execute(query)
    ...

Как вы уже могли себе представить, это решение не помогает.

Чтение ответа Млюбке на вопрос запрос выборки Python MySQL

«Вы передаете аргументы в функцию execute, а не подстановку строки Python»

Я сразу понял, где был неправ;но я все еще чувствую, что чего-то не хватает: я пробовал разные решения, но я определенно недоволен всеми из них.

Есть ли "хороший" способ инкапсулировать мой connect_and_get_data(query) функция, чтобы служить мне так, как я хочу, или я совершенно не на этом пути?

Какие из них считаются «лучшими практиками» в этой ситуации?

1 Ответ

6 голосов
/ 11 ноября 2011

Я думаю, это то, что вы ищете.

def connect_and_get_data(query, data):
    ...
    cursor.execute(query, data)
    ...

def get_data_about_first_amazing_topic(useful_string):
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s"
    connect_and_get_data(query, ("one","two","three"))
    ...

Но если вы собираетесь быстро выполнить несколько запросов, было бы лучше повторно использовать ваше соединение, так как слишком большое количество соединений может тратить время.

...
CONNECTION = MySQLdb.connect(host=..., port=...,
                             user=..., passwd=..., db=...,
                             cursorclass=MySQLdb.cursors.DictCursor,
                             charset = "utf8")
cursor = CONNECTION.cursor()
cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", ("first", "amazing", "topic"))
first_result = cursor.fetchall()

cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", (("first", "amazing", "topic")))
second_result = cursor.fetchall()

cursor.close()
...

Это сделает ваш код намного лучше.

...