2016-03-15 44 views
-1

我這是爲了查詢數據庫如下功能:如何引用函數參數字符串中的

def raw_disc(make): 
    data_make = pd.DataFrame(disc.queryRedshift(
    """select D.model_slug, 
      D.cap_engine_id, 
      D.dealership_id, 
      D.cash_percentage, 
      D.cash_post_discount_amount as cash_post 
     from quotes_site.discounts D join quotes_site.dealerships DLR 
       on D.dealership_id = DLR.id 
     where DLR.archived <> 't' 
       and DLR.suspended <> 't', 
       -> and DLR.make = "make" 
       group by 1,2,3,4,5""")) 
    return data_make 

因爲查詢是三重引號內我不能添加包含在一個字符串參數做成where子句中DLR.make = "make"

至於我記得在CI會做類似「%s」的,$ d(記不清了)有沒有在python

任何建議或資源以類似的方式將不勝感激

+1

http://stackoverflow.com/questions/35974056/string-substitution-in-python-3 – Bahrom

回答

1

我想你想要的東西看起來是這樣的:

def raw_disc(make): 
    data_make = pd.DataFrame(disc.queryRedshift(
    """select D.model_slug, 
      D.cap_engine_id, 
      D.dealership_id, 
      D.cash_percentage, 
      D.cash_post_discount_amount as cash_post 
     from quotes_site.discounts D join quotes_site.dealerships DLR 
       on D.dealership_id = DLR.id 
     where DLR.archived <> 't' 
       and DLR.suspended <> 't', 
       -> and DLR.make = '{0}' 
       group by 1,2,3,4,5""".format(make))) 
    return data_make 
1

您已經標記問題亞馬遜紅移,和你的代碼表明您使用熊貓。熊貓有內置的閱讀SQL查詢的結果(或整個表)轉換成數據幀的能力:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html

如果您使用SQLAlchemy,其紅移的作品,你就可以使用把params參數的pandas.read_sql和類似的方法:

PARAMS:列表中,元組或字典,可選的,默認:無參數

列表傳遞給執行方法。用於傳遞參數的語法是數據庫驅動程序相關的。檢查您的數據庫驅動程序文檔,瞭解支持PEP 249的參數風格中描述的五種語法風格中的哪一種。例如。爲psycopg2,使用%(名)這麼使用PARAMS = { '名稱': '值'}

實施例(假定已安裝的SQLAlchemy和SQLAlchemy的紅移包):

import pandas as pd 
from sqlalchemy import create_engine 
engine = create_engine('redshift+psycopg2://user:[email protected]:1234/db') 

name = 'test' 
key = 10 

df = pd.read_sql('''SELECT * FROM mytable WHERE name = %(name)s AND key > %(key)s''', 
         engine, 
         params={'name': name, 'key': key}) 

這避免了SQL injection的危險,如果你自己去設置格式化字符串的路線,那麼其他人已經建議了。

相關問題