【问题标题】:iterate over function arguments and retain sort order in python迭代函数参数并在python中保留排序顺序
【发布时间】:2013-02-03 18:26:34
【问题描述】:

我需要在 python 中调用存储过程。 包装函数接受 n 个参数。 根据参数列表,我需要引用或取消引用参数。我还需要发送一个空参数。

如何遍历函数参数并构建 SQL 字符串?

例如。存储的 proc 调用如下所示 - 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)";

我尝试使用 locals() 但它返回一个无序列表

我是 python 新手,所以任何线索都会有很大帮助。

【问题讨论】:

  • 使“函数的外观”(即程序其余部分的接口)尽可能“友好”通常是个好主意。为什么你需要引用一些论点,而另一些则不需要?似乎让生活变得更加困难......函数不能处理这个吗?
  • 感谢您的回复。我们可以编写它以便函数处理它。但是,这是对现有应用程序的重写。尽量减少现有应用程序中的代码更改次数。当前的 UI 层使用一组参数进行调用,我们现在需要一个 python 包装器来调用底层的存储过程。引号用于处理字符串而不是整数。将 NULL 作为存储过程调用的一部分传递会带来额外的复杂性。
  • 我现在明白了。我已经发布了一个答案,我相信它可以满足您的所有要求 - 如果没有,您应该能够很容易地找出所需的更改。
  • 太棒了。这有帮助。正是我想要的。
  • 感谢大家的回复。想出了解决这一问题的不同方法。我只是不能对答案投票(显然没有足够的声誉:))..

标签: python function arguments locals ordereddictionary


【解决方案1】:

以下内容完全符合您的要求。它首先将列表 AV 初始化为所有 NULL,然后迭代提供的参数数量,并适当地替换它们以形成您想要的查询字符串。 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)

【讨论】:

  • execSp("'); 删除表 CUSTOMERS; --")
  • SQL注入角度很重要。但是,我坚持使用不允许我使用 cursor.execute 语句的 python db 接口。肯定会将此作为打开界面的增强请求的一部分。
【解决方案2】:

您可以使用*args 构造:

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

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

【讨论】:

    【解决方案3】:

    你可以这样做:

    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>
    

    【讨论】:

      【解决方案4】:
      >>> def f(*args):
      ...   for a in args:
      ...     print a
      ... 
      >>> f(1, 2, 3, 4)
      1
      2
      3
      4
      

      【讨论】:

        【解决方案5】:

        您需要构建自己的查询吗?通常,您将依靠 DB api 为您引用您的论点。这将避免您遭受 SQL 注入的困扰。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-04
          • 1970-01-01
          • 1970-01-01
          • 2017-03-04
          • 2012-10-18
          • 2013-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多