我编写了一个Python 3.7
脚本,该脚本使用单个语句查询的多个对象异步(asyncio 3.4.3 and aiohttp 3.5.4)
创建Salesforce
批量 API(v45.0)
作业/批处理SOQL
,等待批处理完成,完成后将结果下载(流式传输)到服务器,进行一些数据转换,以及然后最后将结果同步上传到SQL Server 2016 SP1 (13.0.4560.0)
. 我已经进行了很多成功的试运行,并认为它运行良好,但是,我最近开始间歇性地收到以下错误,并且对如何修复感到不知所措,因为很少有关于此的报告/解决方案在网上:
aiohttp.client_exceptions.ClientPayloadError:响应负载未完成
示例代码片段:
import asyncio,aiohttp,aiofiles
from simple_salesforce import Salesforce
from xml.etree import ElementTree
#Establish a session using the simple_salesforce module
sf = Salesforce(username=username,
password=password,
security_token=securityToken,
organizationId=organizationId)
sfAPIURL = 'https://myinstance.salesforce.com/services/async/45.0/job/'
sfDataPath = 'C:/Salesforce/Data/'
#Dictionary to store information for the object/job/batch while the script is executing
objectDictionary =
{'Account': {'job':
{'batch': {'id': '8596P00000ihwpJulI','results': ['8596V00000Bo9iU'],'state': 'Completed'},
'id': '8752R00000iUjtReqS'},
'soql': 'select …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将凭据嵌入到我的 SQL Server 2008R2 数据库上的帐户的 Excel 2016 工作簿中,该帐户对某些存储过程具有执行权限,以向最终用户提供只读数据。用户帐户本身无权访问数据库,其想法是将此只读帐户的凭据嵌入到 Excel 电子表格中,用户只需单击“全部刷新”即可获取从存储过程返回的最新数据.
澄清一下,我不在乎用户是否知道帐户的密码 - 这不是问题。我只是不想让他们不得不输入密码来刷新数据。
这是我迄今为止在 Excel 中尝试过的:
我不认为我会在这里输入任何内容,因为我在构建查询字符串时已经输入了凭据,但我还是输入了,因为似乎需要输入某些内容。我将 Excel 文件交给另一个用户,并且肯定拒绝了足够的访问,因为它默认使用他们当前的 Windows 登录来访问数据库。
是什么赋予了?我有一个同事有一个 Excel 2010 文件,他们可以进入并编辑连接字符串属性而不会出现问题,并且他们的文件可以工作。我怎样才能让它在 Excel 2016 中工作?
我真的很感激你们能提供的任何帮助!
编辑:这个问题似乎并不遥远..有谁知道如何做到这一点?我觉得应该很简单。
场景:我需要从 Web 应用程序的 API 收集分页数据,该 API 的调用限制为每分钟 100 次。我需要返回的 API 对象每页包含 100 个项目,总共有 105 个页面,而且还在不断增加(总共约 10,500 个项目)。同步代码需要大约 15 分钟来检索所有页面,因此那时不必担心达到调用限制。但是,我想加快数据检索速度,因此我使用asyncio
和实现了异步调用aiohttp
。数据现在在 15 秒内下载 - 很好。
问题:我现在达到了呼叫限制,因此在最近 5 次左右的呼叫中收到 403 错误。
建议的解决方案我实现了try/except
在get_data()
函数中找到的。我拨打电话,然后当由于403: Exceeded call limit
我退后back_off
几秒钟而未成功拨打电话并重试retries
多次时:
async def get_data(session, url):
retries = 3
back_off = 60 # seconds to try again
for _ in range(retries):
try:
async with session.get(url, headers=headers) as response:
if response.status != 200:
response.raise_for_status() …
Run Code Online (Sandbox Code Playgroud) 我的目标是在 S3 中接收 csv 文件,将它们转换为 avro,并根据 AWS 中的适当架构验证它们。
我根据已有的 .avsc 文件在 AWS Glue Registry 中创建了一系列架构:
{
"namespace": "foo",
"type": "record",
"name": "bar.baz",
"fields": [
{
"name": "column1",
"type": ["string", "null"]
},
{
"name": "column2",
"type": ["string", "null"]
},
{
"name": "column3",
"type": ["string", "null"]
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦我尝试从 Glue 中提取模式,API 似乎并没有提供定义详细信息:
glue = boto3.client('glue')
glue.get_schema(
SchemaId={
'SchemaArn': schema['SchemaArn']
}
)
Run Code Online (Sandbox Code Playgroud)
返回:
{
'Compatibility': 'BACKWARD',
'CreatedTime': '2021-08-11T21:09:15.312Z',
'DataFormat': 'AVRO',
'LatestSchemaVersion': 2,
'NextSchemaVersion': 3,
'RegistryArn': '[my-registry-arn]',
'RegistryName': '[my-registry-name]',
'ResponseMetadata': {
'HTTPHeaders': { …
Run Code Online (Sandbox Code Playgroud) 我尝试在 AWS Glue Spark 作业中运行最新版本的 boto3,以访问 Glue 默认版本中不可用的方法。
为了获取 boto3 的默认版本并验证我想要访问的方法不可用,我运行了这段代码,除了我的print
语句之外,它都是样板代码:
import sys
import boto3
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
athena = boto3.client('athena')
print(boto3.__version__) # verify the default version boto3 imports
print(athena.list_table_metadata) # method I want to verify I can access in …
Run Code Online (Sandbox Code Playgroud) 我有一个 AWS AppFlow 流设置,旨在接收 Salesforce 更改事件并在 Redshift 表上进行处理,以便在 Salesforce 中全天发生更改时保持 Redshift 表最新。
仅使用 AppFlow 并将源映射到 Redshift 中的目标字段似乎并不能达到我想要的效果,因为它似乎只是将更改附加到目标 Redshift 表 - 没有更新、删除等。
我认为解决这个问题的方法是将 AppFlow 的目标更改为 Amazon EventBridge,设置规则来侦听更改,定位 Lambda 函数,并根据事件详细信息对相应的表执行 Redshift 操作。
然而,在 Lambda 中进行这些更改和测试后,我遇到了事件问题。根据 Salesforce 的说法,更改事件消息应如下所示:
{
"data": {
"schema": "<schema_ID>",
"payload": {
"ChangeEventHeader": {
"entityName" : "...",
"recordIds" : "...",
"changeType" : "...",
"changedFields": [...],
"changeOrigin" : "...",
"transactionKey" : "...",
"sequenceNumber" : "...",
"commitTimestamp" : "...",
"commitUser" : "...",
"commitNumber" : "..."
},
"field1":"...",
"field2":"...",
. . …
Run Code Online (Sandbox Code Playgroud) 我已经四处寻找解决方案,但没有看到任何仅适用于 PowerShell 的解决方案。我见过一些PowerShell/VBA 解决方案,但没有说单独使用 PowerShell 是不可能完成的。如果可能的话,我宁愿不使用 VBA,而只使用 PowerShell。
我有一些包含多个工作表的工作簿,当前需要手动刷新这些工作簿以从 SQL Server (2008 R2) 数据库实例检索数据。如果我逐行运行并等待刷新操作完成,我可以使用以下代码完成所需的一切:
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open('C:\test.xlsx')
$Excel.Visible = $True
$Workbook.RefreshAll()
$workbook.Save()
$Workbook.Close()
$Excel.Quit()
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,当我按预期运行整个脚本时,该Save()
方法在刷新操作仍在运行时执行,导致此提示,从而中断Save()
、Close()
和Quit()
方法:
我当然可以Start-Sleep
在循环中使用 cmdlet 使用静态时间间隔等待数据库连接完成,但是,执行的存储过程的时间范围为 2 秒到 3 分钟,每次刷新时休眠似乎浪费资源像那样。
我上面链接的 Stack Overflow 答案列出了 3 种可能的解决方案,但我没有看到 PowerShell 对象中列出的可用属性(例如,使用 PowerShell 时不存在 QueryTable.Refreshing)。尽管代码示例是使用 PowerShell 编写的,但它们似乎可以在 VBA 中使用。这些例子是错误的还是我在这里遗漏了一些东西?
我的问题:是否可以通过仅使用 PowerShell 在使用某种“Excel 正在刷新/忙碌”属性之前RefreshAll()
和之前添加动态“等待”操作来完成上面的代码?Save()
python ×4
aiohttp ×2
asynchronous ×2
aws-glue ×2
boto3 ×2
salesforce ×2
aws-lambda ×1
excel ×1
excel-2016 ×1
powershell ×1
python-3.x ×1
rest ×1
sql ×1