2013-02-03 89 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)