小编gbe*_*ven的帖子

使用 asyncio/aiohttp 未完成响应负载

我编写了一个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)

python asynchronous salesforce python-3.x aiohttp

8
推荐指数
1
解决办法
4313
查看次数

在 Excel 2016 (O365) 中嵌入 SQL Server 凭据以按需刷新数据

我正在尝试将凭据嵌入到我的 SQL Server 2008R2 数据库上的帐户的 Excel 2016 工作簿中,该帐户对某些存储过程具有执行权限,以向最终用户提供只读数据。用户帐户本身无权访问数据库,其想法是将此只读帐户的凭据嵌入到 Excel 电子表格中,用户只需单击“全部刷新”即可获取从存储过程返回的最新数据.

澄清一下,我不在乎用户是否知道帐户的密码 - 这不是问题。我只是不想让他们不得不输入密码来刷新数据。

这是我迄今为止在 Excel 中尝试过的:

  • 数据(选项卡)> 获取数据> 从数据库> 从 SQL Server 数据库> 我输入服务器、数据库和我的“exec sp”命令,这对我来说返回数据没有问题。但是,如果我将文件交给另一个无权访问数据库的用户,连接将失败,因为 Excel 正在尝试使用 Windows 凭据。所以我尝试编辑连接字符串(数据(选项卡)> 查询和连接> 右键单击​​查询> 属性> 定义(选项卡)> 连接字符串)但这些字段是灰色的,所以我无法添加用户 ID 和密码部分的连接字符串。
  • 数据(选项卡)> 获取数据 > 从其他来源 > 从 OLEDB > 构建 > 提供程序(选项卡)我选择“SQL Server Native Client 10.0”> 连接(选项卡)我输入服务器名称,“使用特定的用户名和密码”单选检查并输入帐户用户名/密码,选择数据库,“测试连接”返回有效>所有(选项卡)>将“集成安全”设置为“假”>确定>确定>Excel然后提示输入来自数据库/Windows/的凭据默认或自定义:

在此处输入图片说明 我不认为我会在这里输入任何内容,因为我在构建查询字符串时已经输入了凭据,但我还是输入了,因为似乎需要输入某些内容。我将 Excel 文件交给另一个用户,并且肯定拒绝了足够的访问,因为它默认使用他们当前的 Windows 登录来访问数据库。

  • 我将从数据连接向导(旧版)添加到我的功能区,作为使用与上一次尝试相同的设置构建连接字符串的替代方法,并且每次我想刷新时都会提示我输入密码:

在此处输入图片说明

是什么赋予了?我有一个同事有一个 Excel 2010 文件,他们可以进入并编辑连接字符串属性而不会出现问题,并且他们的文件可以工作。我怎样才能让它在 Excel 2016 中工作?

我真的很感激你们能提供的任何帮助!

编辑:这个问题似乎并不遥远..有谁知道如何做到这一点?我觉得应该很简单。

sql sql-server-2008-r2 excel-2016

5
推荐指数
1
解决办法
1万
查看次数

异步请求退避/节流最佳实践

场景:我需要从 Web 应用程序的 API 收集分页数据,该 API 的调用限制为每分钟 100 次。我需要返回的 API 对象每页包含 100 个项目,总共有 105 个页面,而且还在不断增加(总共约 10,500 个项目)。同步代码需要大约 15 分钟来检索所有页面,因此那时不必担心达到调用限制。但是,我想加快数据检索速度,因此我使用asyncio和实现了异步调用aiohttp。数据现在在 15 秒内下载 - 很好。

问题:我现在达到了呼叫限制,因此在最近 5 次左右的呼叫中收到 403 错误。

建议的解决方案我实现了try/exceptget_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)

python rest asynchronous python-asyncio aiohttp

5
推荐指数
1
解决办法
902
查看次数

如何使用 boto3 获取 AWS Glue Schema Registry 架构定义?

我的目标是在 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)

python amazon-web-services boto3 aws-glue

5
推荐指数
1
解决办法
3478
查看次数

如何使用当前版本的 boto3 运行 AWS Glue Python Spark 作业?

我尝试在 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)

python configuration amazon-web-services boto3 aws-glue

4
推荐指数
1
解决办法
5495
查看次数

AWS AppFlow Salesforce 到 Lambda 不完整事件

我有一个 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)

salesforce amazon-web-services aws-lambda aws-event-bridge

2
推荐指数
1
解决办法
758
查看次数

使用 PowerShell 保存/关闭之前,等待刷新 Excel 工作簿中每个工作表中的外部数据连接

我已经四处寻找解决方案,但没有看到任何仅适用于 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()

excel powershell

1
推荐指数
1
解决办法
2815
查看次数