将变量传递给SOQL中的选择查询

时间:2016-02-10 21:40:01

标签: python apex soql

我正在运行一个Python脚本,该脚本使用simple-salesforce package来查询Salesforce帐户中的所有数据。对于上下文,脚本读取存储在CSV文件中的字典,并将特定值(字符串)存储在变量中(参见下文)。

    with open('/Users/username/Documents/filename.csv', 'rU') as f:
        mydict = dict(filter(None, csv.reader(f)))
    myString = mydict['key']

然后,我想将变量(myString)传递给SOQL选择查询。但是,当我尝试将变量传递给查询时,我收到以下错误:仅在Apex代码中允许绑定变量。下面,您可以看到我尝试以简单的salesforce格式运行SOQL查询的查询。

    sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = myString")

我的问题是:如何将我的变量传递给SOQL选择查询?如果这是最好的解决方案,我愿意使用Apex或Dynamic SOQL,但如果这是最佳解决方案,请告知如何在我的Python脚本中使用Apex代码(即,如果我需要指定我切换到Apex的位置或安装Apex不知何故)。

2 个答案:

答案 0 :(得分:3)

@ harfel的答案很接近,但它的引号错误,因为SOQL中的字符串文字必须用单引号括起来。

这是解决问题的第一次尝试:

# What happens if myString is "John O'Groats"?
sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = '%s'" % myString)

虽然Salesforce的专有语言Apex支持参数化SOQL,但是通过REST API调用Salesforce时无法使用参数化SOQL,就像simple-salesforce那样。如果我们想在SOQL查询中使用未知值,则字符串连接是我们唯一的选择。

但是,如果我们要将字符串值连接到SOQL查询中,我们必须逃避'任何保留字符以避免SOQL注入。关于此的Salesforce文档非常清楚:只有两个reserved characters:反斜杠\和单引号'。将转义字符串值的函数如下:

def soqlEscape(someString):
    # Escape backslashes and single-quotes, in that order.
    return someString.replace("\\", "\\\\").replace("'", "\\'")

我们可以使用此功能更好地解决问题:

sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = '%s'" % soqlEscape(myString))

或者,如果您知道contact__c参数的值只是字母数字,那么您可以事先验证该值而不是转义它:

if myString.isalnum():
    # Value is alphanumeric, safe to concatenate in.
    sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = '%s'" % myString)
else:
    raise ValueError("Invalid contact__c: '%s'" % myString)

'安装' Apex不是一个选项:它只能在Salesforce自己的服务器上运行。

答案 1 :(得分:0)

我没有使用简单的salesforce包的经验,但是看看你的代码,我想知道答案可能不是那么简单

sf.query('SELECT Id, Name FROM deal__c WHERE contact__c = "%s"' % myString)

即,将myString的输入查询而不是名称