Wir haben ein schönes Stück Python, das einige E-Mails sendet und mit einem Cloud-System interagiert. Funktioniert gut. Aber wir müssen es alle paar Minuten abfeuern, um die Datenbank abzufragen. Aus geschäftlichen Gründen muss das Python-Skript wirklich in Echtzeit ausgelöst werden, damit keine Abfrageverzögerung auftritt. (Dies dient Verkäufern, die mit Kunden telefonieren.)
Wir wollen wirklich keine 1-minütige Abfrageschleife. Oder 30 Sekunden. Wir möchten, dass die Aufzeichnung in der Datenbank angezeigt wird und dass die Dinge sofort geschehen.
Der schnelle Weg, um diese Fliege zu machen, besteht darin, sie auslösen zu lassen, wenn ein bestimmter Datensatztyp in eine Tabelle eingefügt wird.
Können wir ein Python-Skript über einen Trigger auslösen?
Gemäß Aarons Anmerkung unten wissen wir, dass dies eine sehr schlechte Sache ist , aber diese Tabelle wird nur sehr wenig genutzt (0-12 Einfügungen pro Tag). Das Abrufen der Tabelle entspricht nicht unseren geschäftlichen Anforderungen (die .py muss sofort ausgeführt werden - sie reicht weit mehr als das Senden einer E-Mail).
Wir glauben, dass eine Möglichkeit, unsere geschäftlichen Anforderungen zu erfüllen, darin besteht, die .net-Version von Python auf dem SQL Server einzurichten und dann T-SQL das Python-Skript so aufrufen zu lassen, wie es C # -Material aufruft ... aber wir haben keine Ahnung, wie mach das eigentlich! (ergo diese Frage).
Dokumente / Details?
Ich habe eine Folgefrage zum Stapelüberlauf gestellt: Wie erstelle ich eine Python-CLR-Prozedur in SQL Server?
Die Frage unter der Frage : Sie haben ein Stück Python. Sie möchten, dass es von einem SQL-Trigger ausgelöst wird, aber Sie wissen, dass dies eine sehr schlechte Sache ist. Was tun Sie also, um denselben Effekt zu erzielen, ohne Python-Code mitten in einer SQL-Operation zu haben?
Was ist der nicht auslösende, nicht abfragende Ansatz zur Lösung dieses Bedarfs?
(Der gleiche Effekt = "Einfügen / Aktualisieren / Löschen tritt in einer Tabelle auf und ein Python-Skript wird innerhalb von 2 Sekunden nach dem Datenbankereignis ausgelöst, ohne die Tabelle abzufragen")
quelle
Antworten:
Lassen Sie Ihre Benutzertransaktion nicht auf den (hoffentlich!) Erfolgreichen Abschluss des Python-Skripts warten. Ihre gesamte Transaktion befindet sich dort und wartet darauf, dass dieser externe Prozess ausgeführt wird, versucht wird, E-Mails zu senden usw. Ich bezweifle, dass die E-Mail wirklich sofort gelöscht werden muss - insbesondere, da Sie keine Verzögerungen kontrollieren können, die beim Weiterleiten auftreten sowieso in den Posteingang des Empfängers. Warum nicht einfach den Prozess häufiger ausführen, wenn das Timing so wichtig ist?
Bitte schauen Sie sich diesen Tipp an .
Wenn Sie dies wirklich, wirklich, wirklich falsch machen möchten, können Sie es einfach aktivieren
xp_cmdshell
und abfeuern.Angenommen, der Benutzer hat Zugriff auf
xp_cmdshell
und / oder das SQL Server-Dienstkonto kann den Ordner sehen, in dem das Python-Skript gespeichert ist, sollten Sie dies über Ihren Trigger tun können:Als beiseite, sollten Sie in Ihrer Frage sagen , dass Sie sich bewusst , dass dies eine sehr schlechte Sache TM , aber Sie sind nicht mit dem betreffenden, aus welchem Grunde. Ich glaube immer noch nicht, dass Sie so viel Echtzeit bekommen, wie Sie erwarten, selbst wenn Sie dies vom Abzug aus abfeuern. Haben Sie Datenbank-Mail anstelle von Python in Betracht gezogen?
quelle
Wenn Sie zunächst einen Trigger verwenden, um eine Nachricht in eine für diesen Zweck bestimmte Tabelle zu schreiben, können Sie den Pooling-Prozess kontinuierlich mit einer Wartezeit von 1 Sekunde oder sogar weniger ausführen. Der Schlüssel besteht darin, die Abfrageabfrage billig genug zu machen (<1 ms) und keine andere Transaktion (also die dedizierte "Warteschlangentabelle") zu stören.
ZB lassen Sie Ihren Abrufprozess einen Stapel wie folgt ausführen:
Warten Sie bis zu 25 Sekunden, bis eine Zeile in der Tabelle angezeigt wird, und rufen Sie jede Sekunde ab. Bei einer Zeitüberschreitung wird einfach eine leere Ergebnismenge zurückgegeben.
Am einfachsten ist es dann, Service Broker zusammen mit einer internen Aktivierungsprozedur zu verwenden, die Python über xp_cmdshell aufruft, oder einem externen Prozess, der ein blockierendes RECEIVE in der Ziel-Service-Broker-Warteschlange durchläuft. So funktioniert Database Mail unter der Haube.
quelle
Um die Auswirkungen der synchronen Ausführung des Python-Skripts von Ihrem Trigger aus zu minimieren, können Sie Ihren Python-Code in Folgendes einschließen
BaseHTTPServer
:Sie können dann eine HTTP-Anforderung von Ihrem Trigger an den obigen Daemon senden, wie beispielsweise in dieser SO-Q & A gezeigt . Der Anforderungshandler kann sogar einen separaten Thread zum asynchronen Ausführen Ihrer Python-Logik erzeugen.
quelle