2014-10-28 70 views
4


我試圖將我的代碼重構爲PEP8標準以提高可讀性,但我努力在我的SQL查詢中轉義引號。 我有2個問題。首先是一個簡單的SQL查詢。第二個是Redshift UNLOAD命令。Redshift中的轉義引號查詢

query = '''SELECT * FROM redshift_table 
      LEFT JOIN 
      (SELECT DISTINCT * FROM redshift_view) v 
      ON redshift_table.account_number = v.card_no 
      WHERE timestamp < date_trunc('day', CURRENT_DATE) 
      AND timestamp >= (CURRENT_DATE - INTERVAL '1 days')''' 

unload = '''UNLOAD ('%s') to '%s' 
      credentials 'aws_access_key_id=%s;aws_secret_access_key=%s' 
      delimiter as '%s'parallel off ALLOWOVERWRITE''' % (query, s3_path, access_key, aws_secret, file_delimiter) 

因爲SQL查詢卸載命令內嵌入的,我只能讓它通過轉義引號與3個反斜槓的工作在前面加上他們:「天」變爲///「天///」。
這並不理想,我想知道是否有解決辦法。

任何幫助,非常感謝。謝謝。

回答

0

由於您只需在引用之前在unload命令中插入反斜槓,因此使用轉義函數即可。這是一個例子。

def escape_quote(value): 
    return value.replace("'", "\\'") 

query = '''SELECT * FROM redshift_table 
      LEFT JOIN 
      (SELECT DISTINCT * FROM redshift_view) v 
      ON redshift_table.account_number = v.card_no 
      WHERE timestamp < date_trunc('day', CURRENT_DATE) 
      AND timestamp >= (CURRENT_DATE - INTERVAL '1 days')''' 

unload = '''UNLOAD ('%s') to '%s' 
      credentials 'aws_access_key_id=%s;aws_secret_access_key=%s' 
      delimiter as '%s'parallel off ALLOWOVERWRITE''' % (escape_quote(query), s3_path, access_key, aws_secret, file_delimiter) 
+0

這絕對是一個優雅的解決方案。然而,我想知道是否有一種方法可以利用psycopg2,它已經執行了sql查詢的轉義,以避免添加額外的代碼。 – Zihs 2014-10-29 14:44:08

+0

這不考慮已經逃脫的引號。這段代碼將通過轉義反斜槓來有效避開它。請閱讀Friedl的掌握正則表達式以獲得標準正則表達式,以便在考慮嵌入轉義字符的情況下匹配並避免引用的字符串。 – bluesmoon 2016-08-29 21:43:21