2013-02-03 124 views
2

我需要在python中調用存儲過程。包裝函數接受n個參數。 根據參數列表,我需要引用或取消引用參數。我也需要發送一個空參數。迭代函數參數並保留python中的排序順序

如何迭代函數參數並構建SQL字符串?

例如。在存儲過程調用看起來是這樣的 - SP_TEST(「CHRA」,INTB,CHRC)

def execSp(a,b,c,d): 
    <iterate through params and build param list> 
    #If the parameter c is null the SQL should be built as below 
    SQL="exec SP_TEST('a',b,Null)"; 

我試着用當地人(),但是它返回一個無序列表

是新來的蟒蛇,因此任何線索將是很有幫助。

+1

它通常是一個好主意,讓「功能的臉」 - 也就是說,接口程序的其他部分,如「友好「儘可能。你爲什麼需要引用一些參數,而其他的不是?似乎讓生活變得更加困難......該功能可以不處理這個問題嗎? – Floris

+0

感謝您的回覆。我們可以編寫它,以便函數處理它。但是,這是重寫現有的應用程序。試圖儘量減少現有應用程序中的代碼更改次數。當前的UI層使用一定數量的參數進行調用,我們現在需要一個python包裝來調用底層存儲過程。引號是處理字符串而不是整數。作爲存儲過程調用的一部分,能夠傳遞NULL是額外的複雜性。 – Ansirk

+0

我現在明白了。我已經發布了一個答案,我相信你所要求的一切 - 如果沒有,你應該能夠很容易地找出需要的改變。 – Floris

回答

0

以下內容完全不符合您的要求。它首先將列表AV初始化爲全空,然後迭代所提供的參數數量,並將它們適當地替換以形成您想要的查詢字符串。 SQL =字符串僅將引號添加到第一個參數。我是否正確理解你想要做的事情?

def execSp(*args): 
    AV = [] 
    SQL = "exec SP_TEST("; 
    for ii in range(0,4) : 
    AV.append("NULL"); 
    ii = 0; 

    for a in args: 
    AV[ii] = str(a); 
    ii+=1; 

    SQL = SQL + "\'" + AV[0] + "\'," + AV[1] + "," + AV[2] + "," + AV[3] + ")"; 
    print SQL 

execSp("hello", 1, 2, 3); 
execSp("hi", 2, 3); 

當我跑,我得到

exec SP_TEST('hello',1,2,3) 
exec SP_TEST('hi',2,3,NULL) 
+1

execSp(「'); drop table CUSTOMERS; - 」) –

+0

SQL注入角度很重要。但是,我堅持使用不允許使用cursor.execute語句的python db接口。肯定會將此作爲增強請求的一部分來打開界面。 – Ansirk

0

您可以使用*args結構:

In [1]: def execSp(*args): print args 

In [2]: execSp('abc', 1, 'xyz') 
('abc', 1, 'xyz') 
0

你可以做這樣的事情:

def execSp(*args): 
    if len(args) != 4: 
     raise SomeException() 
    a,b,c,d = args 
    <you can now iterate over args and use a,b,c,d as required> 
0
>>> def f(*args): 
... for a in args: 
...  print a 
... 
>>> f(1, 2, 3, 4) 
1 
2 
3 
4 
0

你需要建立自己的查詢?通常,你會依靠DB api來引用你的論點。這將避免你遭受SQL注入。

cursor.execute('exec SP_TEST(?, ?, ?)', a, b, c)