Community • 11. April 2024

Python als Brücke zwischen PostgreSQL und Salesforce

In diesem Artikel zeigen wir, dass die allgemeine Programmiersprache Python eine ausgezeichnete Möglichkeit bietet, wenn Sie Ihre PostgreSQL-Datenbank mit Ihrer Salesforce-Datenbank verknüpfen möchten.

Eine solche Verknüpfung kann mit verschiedenen proprietären Werkzeugen für die Datenintegration und ‑konvertierung gemacht werden. Hier stellen wir − anhand eines Beispiels − eine alternative Open‑Source‑Lösung via Python vor.

In diesem Beispiel sind in einer PostgreSQL-Tabelle 'salesforce_opportunity' Daten des Salesforce-Objekts 'Opportunity' gespiegelt. Mit Hilfe von Python-Code wird dann Folgendes gemacht:

  • Zuerst wird eine Verbindung sowohl zur PostgreSQL-Datenbank als auch zur Salesforce-Datenbank hergestellt.
  • Dann werden Daten des Salesforce-Objekts 'Opportunity' abgerufen, wenn der Zeitstempel in der PostgreSQL-Tabelle 'salesforce_opportunity' besagt, dass es für das Salesforce-Objekt aktuellere Daten gibt.

Salesforce ist nicht nur eine Datenbank, sondern eine umfassende Customer Relationship Management (CRM)-Plattform. Die Salesforce-Datenbank ist ein zentraler Bestandteil dieser Plattform und dient dazu, Daten über beispielsweise Kundeninteraktionen, Verkaufschancen und Marketingaktivitäten zu speichern und zu verwalten.



Mit Python auf die PostgreSQL-Datenbank zugreifen

Um via Python Daten aus einer PostgreSQL-Tabelle zu lesen und zu analysieren, nehmen Sie z. B. die Pandas-Programmbibliothek zusammen mit dem SQLAlchemy-Toolkit.

SQLAlchemy ermöglicht es, eine Verbindung zu einem Datenbank­managementsystem via Python herzustellen; SQLAlchemy unterstützt eine Vielzahl von Systemen, darunter auch PostgreSQL.

Im folgenden Codeschnipsel liegen sämtliche Inhalte der PostgreSQL-Tabelle 'salesforce_opportunity' lokal vor und können mit Python weiterverarbeitet und analysiert werden.

import pandas as pd
from sqlalchemy import URL, create_engine

url_object = URL.create(
    "postgresql",
    host="your_pg_host",
    database="your_pg_database",
    username = "your_pg_user",
    password="your_pg_password"
)

engine = create_engine(url_object)

sql_query = "SELECT * FROM salesforce_opportunity;"

df_pg_table = pd.read_sql_query(
    sql_query,
    con=engine
)

Unix-Zeitstempel der letzten Änderung eines Datensatzes der PostgreSQL‑Tabelle bestimmen:

def _get_pg_table_max_time_stamp(df, column):
    list_time_stamp = df[column].values.tolist()
    max_time_stamp = max([int(i) for i in list_time_stamp])

    return max_time_stamp


pg_table_max_time_stamp = _get_pg_table_max_time_stamp(df_pg_table, 'SystemModstamp')

Im vorherigen Codeschnipsel werden die gesamten Daten zur Ermittlung des entsprechenden Zeitstempels verwendet. Natürlich wäre es auch möglich (und ist oft sinnvoll), schon im Query an die PostgreSQL-Datenbank die Daten direkt an der Quelle zu filtern, zu sortieren o. ä.:

SELECT max("SystemModstamp") FROM salesforce_opportunity;

In Salesforce ist SystemModstamp das Datum und die Uhrzeit der letzten Änderung eines Datensatzes durch eine Benutzerin/einen Benutzer oder durch einen automatisierten Prozess. SystemModstamp wird als sogenannter Unix-Zeitstempel hinterlegt. In unserem Beispiel enthält auch die PostgreSQL-Tabelle 'salesforce_opportunity' eine entsprechende Spalte 'SystemModstamp' mit einem Zeitstempel für jeden einzelnen Tabelleneintrag (das heißt für jede Zeile der Tabelle).



Mit Python auf Salesforce zugreifen

Um mit Python auf eine Salesforce-Datenbank zuzugreifen, kann die Salesforce‑API verwendet werden.

Es gibt verschiedene Bibliotheken und Frameworks, wie simple-salesforce, die es ermöglichen, mit Salesforce über Python zu interagieren und Daten abzurufen, zu aktualisieren oder zu erstellen.

Auf dem Salesforce-Konto lässt sich eine sogenannte Connected-App erstellen. Dadurch kann man auf die Salesforce-API zugreifen und man erhält eine Client-ID und ein Client-Secret.

Die Client-ID und das Client‑Secret ist dann zu verwenden, um sich über Python bei Salesforce zu authentifizieren und einen Zugriffstoken zu erhalten.

Nach der Authentifizierung, können mit Hilfe von entsprechenden Methoden aus der simple‑salesforce-Bibliothek Salesforce-Objekte (in diesem Beispiel das Salesforce-Objekt 'Opportunity') abgerufen, erstellt, aktualisiert oder gelöscht werden.

Erstellen einer Salesforce-Objektinstanz:

from simple_salesforce import Salesforce

sf = Salesforce(
    username='your_sf_username',
    password='your_sf_password',
    security_token='your_sf_security_token',
    client_id='your_sf_client_id',
    client_secret='your_sf_client_secret'
)

Der zuvor von der PostgreSQL-Tabelle 'salesforce_opportunity' abgerufene Zeitstempel kann nicht eins zu eins für eine Abfrage der Salesforce‑API verwendet werden. Stattdessen muss er vom Unix‑Zeitstempel‑Format in ein bestimmtes Format konvertiert werden.

import datetime
import pytz

def _get_sf_time_string(unix_time_stamp):
    dt = datetime.datetime.fromtimestamp(int(unix_time_stamp), tz=pytz.utc)

    salesforce_time_string = f"{dt:%Y-%m-%dT%H:%M:%S}.{dt.microsecond // 1000:03d}Z"

    return salesforce_time_string

sf_time_string_for_soql_query = _get_sf_time_string(pg_table_max_time_stamp)

Auf Salesforce-Objekte zugreifen durch Ausführen einer SOQL-Abfrage mit Hilfe der Salesforce‑Bulk‑API:

soql_query = ("SELECT * FROM " +
              "Opportunity " +
              "WHERE SystemModstamp > " +
              sf_time_string_for_soql_query)

df_sf_opportunity_bulk = pd.DataFrame(sf.bulk.Opportunity.query(soql_query)).drop('attributes', axis=1)

Die sogenannte Salesforce Object Query Language (SOQL) wird in der Salesforce‑Plattform verwendet, um Daten aus Salesforce-Objekten abzufragen. Man benötigt SOQL-Abfragen, um spezifische Informationen aus den Datenbanken von Salesforce zu extrahieren.


Die so abgerufenen, neuen Daten aus Salesforce können nun in die PostgreSQL-Tabelle übertragen werden: Da dabei gegebenenfalls sowohl neue Zeilen eingefügt (INSERT) als auch existierende Zeilen aktualisiert (UPDATE) werden müssen, sollte ein "UPSERT" verwendet werden. Die entsprechende Syntax wäre hier zum Beispiel:

INSERT INTO tabelle VALUES ... ON CONFLICT(id_spalte) DO UPDATE SET ...;

Die exakte Logik, welche Spalten und Werte übernommen werden sollen, sind natürlich vom konkreten Anwendungsfall abhängig, daher gehen wir hier nicht weiter ins Detail.

Fazit

Python eignet sich sehr gut als Brücke zwischen PostgreSQL und Salesforce. Sie können Python verwenden, um Daten aus einer PostgreSQL-Datenbank abzurufen, sie bearbeiten und dann mit der Salesforce-API interagieren, um diese Daten hochzuladen oder zu aktualisieren.

Freie Python-Bibliotheken wie sqlalchemy für PostgreSQL und simple-salesforce für Salesforce können Ihnen dabei helfen, beide Systeme zu verbinden und zwischen beiden Systemen zu interagieren.

Ein großer Vorteil von Python-Skripten ist, dass sie einfach automatisiert ausgeführt werden können − beispielsweise mit Hilfe von Cron-Jobs unter Linux/macOS oder mit dem Task Scheduler unter Windows, um nur zwei Möglichkeiten zu nennen. Dadurch können Sie Ihr Python-Skript zur Verknüpfung von PostgreSQL und Salesforce zu bestimmten Zeitpunkten oder in regelmäßigen Abständen ausführen lassen.

Weitere Beiträge, die Dich interessieren könnten:

Dr. Christoph Welker

Christoph Welker ist promovierter Meteorologe, in Hamburg zu Hause und seit Mai 2022 als GIS-Consultant bei der WhereGroup tätig. Er hat sich in den letzten Jahren auf die Verarbeitung und Visualisierung von Geodaten basierend auf freier Software spezialisiert.

Artikel teilen: