2015-05-09 2 views
1

Я пишу функцию, которая принимает некоторые аргументы и строит строку запроса SQL. В настоящее время у каждого аргумента ключевого слова назначается строка по имени, и я думаю, что должен быть более простой способ автоматически форматировать аргументы ключевого слова, ожидаемые в строке. Мне интересно, можно ли автоматически форматировать (или назначать) аргумент ключевого слова строке запроса, если имя аргумента совпадает.Параметры автоматического форматирования строки

Вот моя текущая функция:

def create_query(
    who_id, 
    what_id=None, 
    owner_id=None, 
    subject, 
    description, 
    due_date, 
    is_closed=False, 
    is_priority=False, 
    is_reminder=True, 
    ): 

    query_str = """ 
     'WhoId':'{who_id}', 
     'Subject':'{subject}', 
     'Description':'{description}', 
     'ActivityDate':'{due_date}', 
     'IsClosed':'{is_closed}', 
     'IsPriority':'{is_priority}', 
     'IsReminderSet':'{is_reminder}', 
     """.format(
      who_id=who_id, 
      subject=subject,    # Mapping each of these to the 
      description=description,  # identically named variable 
      due_date=due_date,    # seems dumb 
      is_closed=is_closed, 
      is_priority=is_priority, 
      is_reminder=is_reminder, 
      ) 

И я хотел бы что-то больше, как это:

def create_query(**kwargs): 
    query_string = """ 
     'WhoId':'{who_id}', 
     'Subject':'{subject}', 
     'Description':'{description}', 
     ... 
     """.format(
      for key in **kwargs: 
       if key == << one of the {keyword} variables in query_string >>: 
        key = << the matching variable in query_string >> 

ответ

2
def create_query(**kwargs): 
    query_string = """ 
     'WhoId':'{who_id}', 
     'Subject':'{subject}', 
     'Description':'{description}', 
     ... 
     """.format(**kwargs) 
    print(query_string) 

Может использоваться как это тогда:

create_query(who_id=123, subject="Boss", description="he's bossy", 
      will_be_ignored="really?") 

Отпечатки:

  'WhoId':'123', 
     'Subject':'Boss', 
     'Description':'he is bossy', 
     ... 

Обратите внимание на дополнительный параметр will_be_ignored, который я ввел. Это просто будет проигнорировано. Вам не нужно фильтровать это самостоятельно.

Но лучше не строить строку запроса самостоятельно. Позвольте этому коннектору базы данных обработать это. Например, если мой пример сказал «он босс», то это сломает запрос, потому что он использует ' в качестве разделителя. Ваш соединитель базы данных должен позволять вам давать запросы с помощью заполнителей и значений, а затем правильно заменять заполнители значениями.

Альтернатива:

def create_query(**kwargs): 
    parameters = (('WhoId', 'who_id'), 
        ('Subject','subject'), 
        ('Description', 'description')) 
    query_string = ','.join(r"'{}':'{{{}}}'".format(name, kwargs[id]) 
          for name, id in parameters 
          if id in kwargs) 
    print(query_string) 

create_query(who_id=123, description="he's bossy", 
      will_be_ignored="really?") 

Печать:

'WhoId':'{123}','Description':'{he's bossy}' 
+0

Спасибо за вашу помощь в этом. Как вы рекомендуете обрабатывать дополнительные kwargs? Например, есть некоторые элементы, которые могут не иметь отношения к запросу, но я хочу предоставить возможность их создания в запросе. В этом примере, если я не передал значение для описания, была бы ключевая ошибка. Согласился, что это не является оптимальным для построения строки запроса, но я работаю с API Salesforce, поэтому я не уверен, как иначе обращаться с этим, кроме как дезинфицировать для цитат и двойных кавычек. –

+0

@JoeFusaro Значит, вы хотите значения по умолчанию, или вы не хотите, чтобы они были в окончательной строке запроса? –

+0

Предпочтение было бы в том, что они вообще не находятся в конечной строке запроса, но значения по умолчанию - в порядке. Не уверен, что оптимально. Я думал о конкатенации на основе, если они включены в kwargs (например, если kwargs ['description']: query_string + = "" ", 'Description': '{description}' .....), но это кажется беспорядочным. –

Смежные вопросы