2013-10-11 22 views
10

我正在使用SQLAlchemy connection.execute(sql)將選擇結果轉換爲地圖數組。有以下代碼Python,SQLAlchemy傳遞參數在connection.execute


def __sql_to_data(sql): 
    result = [] 
    connection = engine.connect() 
    try: 
     rows = connection.execute(sql) 
     for row in rows: 
      result_row = {} 
      for col in row.keys(): 
       result_row[str(col)] = str(row[col]) 
      result.append(result_row) 
    finally: 
     connection.close() 
    return result 

和例如

__sql_to_data(sql_get_scan_candidate)
給了我很好的數據結構(當然,我用這個小數據集)。 但爲了給sql添加參數,我現在使用的格式是

return __sql_to_data(sql_get_profile.format(user_id))

問題 如何修改程序,以使可能的類似

return __sql_to_data(sql_get_profile,user_id)

回答

22

The tutorial給出了這一個很好的例子:

>>> from sqlalchemy.sql import text 
>>> s = text(
...  "SELECT users.fullname || ', ' || addresses.email_address AS title " 
...   "FROM users, addresses " 
...   "WHERE users.id = addresses.user_id " 
...   "AND users.name BETWEEN :x AND :y " 
...   "AND (addresses.email_address LIKE :e1 " 
...    "OR addresses.email_address LIKE :e2)") 
SQL>>> conn.execute(s, x='m', y='z', e1='%@aol.com', e2='%@msn.com').fetchall() 
[(u'Wendy Williams, [email protected]',)] 

首先,把你的SQL字符串將它傳遞給sqalchemy.sql.text()。這是沒有必要的,但可能是一個好主意......

優點文本()提供了一個簡單的字符串是後端中立的綁定參數 支持,每個語句執行選項,以及 爲綁定參數和結果列的鍵入行爲,允許SQLAlchemy類型構造在執行字面指定的語句 時發揮作用。

請注意,即使您沒有使用text(),也不應僅僅使用sql.format(...)。這會導致更大的攻擊風險。

接下來,您可以使用關鍵字參數爲您已經使用的execute()函數指定實際參數。

現在,在你的例子中,你有一個包裝執行功能的函數。所以,如果你想用它來進行多個查詢,你需要使參數能夠接收你的參數。你可以這樣做很簡單的字典:

def _sql_to_data(sql, values): 
    ... 
    conn.execute(sql, values) 

values會那麼dictionary.You可以用你的功能是這樣的...

sql = 'SELECT ...' 
data = { 'user_id' : 3 } 
results = _sql_to_data(sql, data) 

使用關鍵字爲您的參數僅僅是一種方式指定​​函數的參數。您可以通過幾種不同的方式閱讀the documentation

+3

謝謝你,我的壞,由於某種原因,我無法在doc中找到它。我唯一的理由是SQLAlchemy doc有點分散,強調ORM。 – Denis

+0

還有一個問題 - 在內存消耗方面,fetchAll()和結果數據結構中的行程如何與行相關? – Denis

+0

@Denis:我不確定你的意思。也許你應該創建另一個StackOverflow問題,並試着更具體地說明你在問什麼。 –