将变量传递到 SOQL 中的 select 查询
Pass a variable into a select query in 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 select 查询中。但是,当我尝试将变量传递到查询中时,出现以下错误:绑定变量只允许在 Apex 代码中使用。在下面,您可以看到我以 SOQL 查询的简单 salesforce 格式尝试 运行 的查询。
sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = myString")
我的问题是:如何将我的变量传递到 SOQL select 查询中?如果这是最好的解决方案,我愿意使用 Apex 或 Dynamic SOQL,但如果这是最好的解决方案,请告知如何在我的 Python 脚本中使用 Apex 代码(即,如果我需要指定切换到的位置Apex 或以某种方式安装 Apex)。
我没有使用 simple-salesforce 包的经验,但看了你的代码,我想知道答案是否不像
那么简单
sf.query('SELECT Id, Name FROM deal__c WHERE contact__c = "%s"' % myString)
也就是说,在查询中输入 myString 的 value 而不是它的 name.
@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 时无法像 simple-salesforce 那样使用参数化 SOQL。如果我们想在 SOQL 查询中使用未知值,字符串连接是我们唯一的选择。
但是,如果我们要将字符串值连接到 SOQL 查询中,我们必须 'escape' 任何保留字符以避免 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)
'Installing' Apex 不是一个选项:它仅在 Salesforce 自己的服务器上运行。
我是 运行 一个 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 select 查询中。但是,当我尝试将变量传递到查询中时,出现以下错误:绑定变量只允许在 Apex 代码中使用。在下面,您可以看到我以 SOQL 查询的简单 salesforce 格式尝试 运行 的查询。
sf.query("SELECT Id, Name FROM deal__c WHERE contact__c = myString")
我的问题是:如何将我的变量传递到 SOQL select 查询中?如果这是最好的解决方案,我愿意使用 Apex 或 Dynamic SOQL,但如果这是最好的解决方案,请告知如何在我的 Python 脚本中使用 Apex 代码(即,如果我需要指定切换到的位置Apex 或以某种方式安装 Apex)。
我没有使用 simple-salesforce 包的经验,但看了你的代码,我想知道答案是否不像
那么简单sf.query('SELECT Id, Name FROM deal__c WHERE contact__c = "%s"' % myString)
也就是说,在查询中输入 myString 的 value 而不是它的 name.
@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 时无法像 simple-salesforce 那样使用参数化 SOQL。如果我们想在 SOQL 查询中使用未知值,字符串连接是我们唯一的选择。
但是,如果我们要将字符串值连接到 SOQL 查询中,我们必须 'escape' 任何保留字符以避免 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)
'Installing' Apex 不是一个选项:它仅在 Salesforce 自己的服务器上运行。