2015-05-09 87 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?例如,某些項目可能與查詢無關,但我想提供將它們構建到查詢中的選項。在這個例子中,如果我沒有給Description傳遞一個值,那麼會出現一個關鍵錯誤。一致認爲,這是不是最佳的建立查詢字符串,但我正在與Salesforce API,所以我不知道除了消毒報價和雙引號以外如何處理這一點。 –

+0

@JoeFusaro你的意思是你想要默認值,或者你不希望他們在最後的查詢字符串呢? –

+0

首選項是根本不在最終查詢字符串中,但默認值是正確的。不知道什麼是最佳的。我想基於它們是否包含在kwargs中(例如,如果kwargs ['description']:query_string + =「」「,'Description':'{description}'.....),但這似乎很混亂。 –