在Postgres数据库中同步和维护Salesforce Sobjects

gurglefish的Python项目详细描述


咕噜鱼

Salesforce Archiver公司

将Salesforce Sobject数据备份到Postgres并保持同步。

功能
  • 从Salesforce到Postgres的单向数据快照。
  • 简单的cli界面。
  • 动态创建所选对象的等效数据库表。
  • 最多支持4个并发表快照的多处理。
  • 索引的自动创建和维护:
    • id列上的主键索引
    • 主/详细信息和查找字段ID。
    • 外部字段。
  • 自动检测sobject字段的添加/删除以及表结构的更改以匹配。
  • 云已准备好用于亚马逊rds和azure。
  • 自上次运行以来记录添加/更改/删除的同步。
  • 可以根据每个表和命令行禁用硬删除记录的清除。
  • 记录每个表的同步统计信息。
  • 导出功能可使用本地Postgres加载文件格式更快地加载初始数据。
  • 使用代码生成快速字段映射。
  • 以自定义工具易于使用的格式保存的架构工件。
  • 在生产环境中连续运行18个月以上。

安装

要求

  • python 3.6或更高版本
  • PostgreSQL 9.6或更高版本
pip3 install --user gurglefish

要更新:

pip3 install --upgrade gurglefish

要使用导出功能最初填充非常大的表(推荐),必须 为您的系统安装postgresql cli客户端。

示例:

< Buff行情>

ubuntu 18:sudo apt安装postgres客户端

< Buff行情>

CentOS 7:sudo apt install postgres96 client

使用分发包搜索工具(Yum、APT、DNF)查找正确的名称并安装。

配置 < Buff行情>

注意:此工具仅读取Salesforce并写入您配置的数据库/架构。然而,它是 仍然是非常重要的安全您的帐户适当地防止系统入侵。换句话说, 安全是您的责任

要求

  • 启用API的Salesforce用户帐户,具有对要同步的所有Sobject的访问权限
  • Salesforce org中的已配置连接应用程序,可由用户帐户访问
  • postgresql数据库和用户登录,只允许在您选择的架构中创建和更改表和索引。

创建一个名为/var/lib/gurglefish的目录。这是该工具使用的所有主机存储的根目录。 请确保相应地设置了权限,以便正在运行的用户具有R/W权限。必须保护此目录树 适当地,因为它可能包含未加密的表导出

sudo mkdir /var/lib/gurglefish
sudo chmod +rwx /var/lib/gurglefish  # set permissions according to your security needs

如果要使用其他目录或装入点,只需创建指向您的位置的符号链接。 示例:sudo ln-s/mnt/my other storage/sfarchives/var/lib/gurglefish

现在创建一个配置文件,为postgres数据库和salesforce组织提供登录凭据。它是一个标准的ini文件,可以包含多个数据库组织关系的定义。 它看起来像这样(对于单个数据库和组织):

[prod]id=prodlogin=my-api-user@myorg.compassword=password+securitytokenconsumer_key=key from connected appconsumer_secret=secret from connected appauthurl=https://my.domain.salesforce.comdbvendor=postgresqldbname=gurglefishschema=publicdbuser=dbadmindbpass=dbadmin123dbhost=192.168.2.61dbport=5432threads=2
< Buff行情>

注意:保护此文件不被窥视。你显然不想让这些证件被偷。

这些设置大多是不言而喻的:

  • 如果您没有在Salesforce中白名单您的IP,请确保包括您的密码安全令牌, 否则可以忽略标记。
  • authURL选择Salesforce生产URL或https://test.salesforce.com选择沙盒
  • 目前,唯一受支持的dbvendor是postgresql。
  • 模式可以是自定义的,也可以是公共的(默认值)。如果这个数据库。如果数据库要与其他关键数据共享,强烈建议在自定义架构中隔离(请参阅PostgreSQL文档)。
  • 小心使用螺纹。您最多可以有4个,因为这是Salesforce强加的限制。但真正的瓶颈可能是数据库服务器。如果不进行自定义数据库优化,或者在小型平台上运行,则应坚持使用1或2个线程。只有当您确定数据库不是瓶颈时,才可以移动到4个。

入门

现在您(希望)配置正确,您可以下拉Sobject列表并决定要同步哪些Sobject。

使用上面的示例配置:

gurglefish prod --init

如果salesforce登录成功,您将看到新目录/var/lib/gurglefish/db/prod。这是根目录,所有配置和导出数据都将在此连接中存储。

db/prod下,您应该会看到config.json。在你最喜欢的编辑器中打开它。您将在此处看到您的用户帐户可以访问的所有对象的条目。

< Buff行情>

注意:如果您没有看到您知道存在的对象,您可能没有访问这些对象的权限,或者您需要为您的帐户分配特定的许可证(对于商业管理包)。

您可以根据需要自由编辑此文件,但请确保它仍然是有效的json。当检测到新的sobject时,将为此文件添加一个新条目。

示例:

{"configuration":{"sobjects":[{"name":"account","enabled":false,"auto_scrub":"always"},{"name":"account_vetting__c","enabled":false},{"name":"account_addresses__c","enabled":false}]}}

对于要同步的每个sobject,将"enabled"值设置为true
对于要自动检测和清除已删除记录的每个sobject,将"auto_scrub"设置为"always"。但这需要付出api调用的代价,并会减慢整个同步过程。
或者,您可以安排每天运行一次或其他间隔来执行清理。深夜是个不错的选择。

crontab示例(每天凌晨1点进行一次全局清理):

0 9,13,15,17,19 * * 1-5	cd /home/masmith/sfarchive && python3 main.py prod --sync >/tmp/sync.log
0 1 * * 1-5	cd /home/masmith/sfarchive && python3 main.py prod --sync --scrub >/tmp/sync.log

保存文件。

您已经准备好开始提取数据。但有些选择必须首先做出。

初始数据拉取

< Buff行情>

现在是讨论Saleforce API限制的好时机。对于每次运行,对于每个表,将执行一个元数据api调用来检测架构更改,并发出一个查询来下拉更改的记录,每次运行至少为每个表提供2个查询。如果在20个表上每2小时运行一次快照,则为12 x 20 x 2=480/天最小值。我之所以说最小值是因为这是只有不到几百个变化的最佳情况。对于更大的数据查询,salesforce以"chunks"形式返回数据,api用户需要调用salesforce来检索下一个chunks,直到全部检索完毕。因此,对于具有大量活动的Sobject,如用户、帐户、Lead、Opportunity等,每次运行可能会有数百个呼叫。

< Buff行情>

幸运的是,gurglefish在运行结束时会向您报告所使用的api调用总数,以便您可以随时关注它。您可以在这里与记录的限额进行比较。因此,例如,如果您拥有企业许可证,并且有65个以上的用户,那么您每天最多可以拨打1000000个电话。

< Buff行情>

请记住,您正在与其他集成共享这些限制。

根据启用的sobject数、字段数和记录数,数据的初始加载可能需要相当长的时间。但作为一个参考,我看到它在一个超过800条记录的Opportunity表中每秒处理200条记录字段.

我们的建议是让两个sobjects启动,运行它以确保一切顺利。然后,您可以返回并根据需要启用其他Sobjects。换句话说,把你的工作分开。在初始加载期间,您将使用最多的api调用,因此如果需要,请将其隔开。

使用标准快照 对于任何新的表负载,您都可以使用标准的同步/快照。gurglefish将看到您正在同步一个新表并删除所有记录。初始加载完成后,后续运行将只下拉更改。 快照可能会被中断-它们将在下次运行时恢复到中断的位置。

使用本地导出 另一种选择是使用--export功能将所有sobject记录转储为postgres本机可加载格式。然后可以使用--load加载此文件,通常不到一分钟。导出的文件保存在exports/文件夹下并压缩。

< Buff行情>

注意:导出的文件对于存档或备份没有用处,因为它们的格式与它们的sobject/表的当前模式是完整绑定的。如果架构更改,则导出不可用。这是一个Postgres限制,是闪电快速负载的折衷方案。您可以在加载后删除这些文件。

使用Salesforce批量API 这是作为最后手段的边缘案例。 gurglefish将检测检索数据所需的soql是否超过16k,并通知您切换到bulk api来处理它。老实说,如果你有这么宽的桌子,你应该重新考虑你的设计。 要启用,只需将"bulkapi":true添加到config.json中的sobject。所有需要继续进行的同步都将使用Salesforce Bulk API,在某些情况下,如果有许多计划的批量作业挂起,则速度会慢一些。Gurglefish将等待10分钟以启动作业,否则将超时。

运行

	gurglefish prod --sync

说真的,能再简单点吗?

gurglefish将在您选择从salesforce同步的postgres中自动创建任何丢失的表和索引。

快照频率

如果要通过cron或其他机制安排自动运行,则由您决定。当前,所有表都将在每次运行时进行快照-没有按表单独自定义的运行计划。但是,此功能已在路线图中。

统计信息

gurglefish将每次运行的每个表的统计信息记录到两个表:gf_mdata_sync_jobs(master)和gf_mdata_sync_stats(detail)您可以自由查询这些数据以进行报告、审核等。作业统计信息保留2个月,并在它们过期时清除。所以,如果你想让它们保持更长的时间,你应该制定规定,在其他地方同步它们。一个将插入复制到长期表集中的自定义触发器是一个好主意。

此外,自动模式更改的记录记录在gf_mdata_schema_chg中。因此,每当在sobject上检测到一个新的或删除的列时,都会记录在这里。此表从未清除。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用相同的模型、颜色、字体和侦听器创建JTable的副本?   JavaSpring+Thymeleaf:用户时区中的时间   java HTTP请求返回非法状态异常安卓   java xml验证JDK 1.5 JDK 1.6差异   junit如何使用Parasoft从java文件生成测试文件   java使用getSpans方法获取可扩展文件中的所有跨距   javascript无法使用bindingResult设置表单元素   java RCP应用程序活动   获取Java类中泛型字段的类型   java更新查询,从一个依赖于另一个表的表中更改字段   java错误:GWT类型中的方法setBridge(GWTBridge)不适用于参数(GWTBridge)   为什么java/安卓需要在XML元素的开头有一个空格来解析它?   java通用代码,用于将字符串转换为任何所需的类   java如何创建Liferay钩子以扩展购物车portlet的功能   java Selected()方法存在漏洞   java新行附加在我的加密字符串上   使用NaN值的指数平滑的java   使用飞碟和iText发行的java XHTML到PDF   java如何在不使用HTMLDocument的情况下在JTextPane中显示两列文本?