В Python изменение запроса MySQL на основе переменных функции - PullRequest
0 голосов
/ 10 мая 2010

Я бы хотел добавить ограничение к запросу, если user_id! = Нет ... например:

"AND user_id = 5" 

но я не уверен, как добавить это в приведенную ниже функцию?

Спасибо.

def get(id, user_id=None):

    query = """SELECT *
               FROM USERS
               WHERE text LIKE %s AND
                     id = %s
            """
    values = (search_text, id)

    results = DB.get(query, values)

Так я могу позвонить:

get(5)
get(5,103524234) (contains user_id restriction)

Ответы [ 3 ]

4 голосов
/ 10 мая 2010
def get(id, user_id=None):

    query = """SELECT *
               FROM USERS
               WHERE text LIKE %s AND
                     id = %s
            """
    values = [search_text, id]

    if user_id is not None:
        query += ' AND user_id = %s'
        values.append(user_id)

    results = DB.get(query, values)

Как видите, основным отличием вашего исходного кода является небольшой блок if в середине, который обогащает строку запроса и значения при необходимости. Я также сделал values списком, а не кортежем, чтобы его можно было дополнить более естественным append, а не

         values += (user_id,)

, что, возможно, менее читабельно - однако, вы можете использовать его, если хотите сохранить values кортеж по некоторым другим причинам.

edit : OP теперь поясняет в комментарии (!), Что его исходный запрос имеет конечное предложение LIMIT. В этом случае я бы предложил другой подход, например:

   query_pieces = ["""SELECT *
                     FROM USERS
                     WHERE text LIKE %s AND
                         id = %s
                   """, "LIMIT 5"]
    values = [search_text, id]

    if user_id is not None:
        query_pieces.insert(1, ' AND user_id = %s')
        values.append(user_id)

    query = ' '.join(query_pieces)
    results = DB.get(query, values)

Вы можете сделать это другими способами, но ведение списка частей запроса в правильном порядке, обогащение его по ходу (например, с помощью insert) и объединение его с некоторыми пробелами в конце - довольно общий и удобный подход.

2 голосов
/ 10 мая 2010

Что не так с чем-то вроде:

def get(id, user_id=None):
    query = "SELECT * FROM USERS WHERE text LIKE %s"
    if user_id != None:
        query = query + " AND id = %s"%(user_id)
    :
    :

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

1 голос
/ 10 мая 2010

Вы можете построить запрос SQL, используя список условий:

def get(id, user_id=None):
    query = """SELECT *
               FROM USERS
               WHERE 
            """
    values = [search_text, id]
    conditions=[
        'text LIKE %s',
        'id = %s']
    if user_id is not None:
        conditions.append('user_id = %s')
        values.append(user_id)
    query+=' AND '.join(conditions)+' LIMIT 1'
    results = DB.get(query, values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...