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

Phi*_*her 2 python soql apex

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

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

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

    sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = myString")
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*ard 5

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

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

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

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

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

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

我们可以使用这个函数来更好地尝试解决问题:

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

或者,如果您知道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)
Run Code Online (Sandbox Code Playgroud)

“安装”Apex 不是一种选择:它仅在 Salesforce 自己的服务器上运行。