Nous avons un joli morceau de python qui envoie des e-mails et interagit avec un système cloud. Fonctionne bien. Mais nous devons le tirer toutes les quelques minutes pour interroger la base de données. Nous avons vraiment besoin, à des fins commerciales, que le script python se déclenche en temps réel, donc il n'y a pas de délai d'interrogation. (Cela sert les vendeurs qui sont au téléphone avec les clients.)
Nous ne voulons vraiment pas d'une boucle d'interrogation d'une minute. Ou 30 secondes. Nous voulons que le disque s'affiche dans la base de données et que les choses se produisent immédiatement.
Le moyen le plus rapide de faire voler cette mouche est de la déclencher lorsqu'un type d'enregistrement spécifique est inséré dans une table.
Pouvons-nous lancer un script python à partir d'un déclencheur?
Selon la note d'Aaron ci-dessous, nous savons que c'est une Very Bad Thing ™ , mais ce tableau est très très peu utilisé (0-12 inserts par jour). Interroger la table ne répond pas à nos besoins commerciaux (nous avons besoin que le .py s'exécute immédiatement - il fait bien plus que d'envoyer un e-mail).
Nous pensons qu'un moyen de répondre à nos besoins commerciaux est de configurer la version .net de python sur SQL Server, puis de demander à T-SQL d'appeler le script python de la même façon qu'il appelle les éléments C # ... mais nous ne savons pas comment faites ça! (ergo cette question).
Documents / détails?
J'ai posé une question de suivi sur Stack Overflow: comment créer une procédure Python CLR dans SQL Server?
La question sous la question : vous avez un morceau de python. Vous voulez qu'il se déclenche à partir d'un déclencheur SQL, mais vous savez que c'est une très mauvaise chose. Alors, que faites-vous pour obtenir le même effet sans avoir de code python au milieu d'une opération SQL?
Quelle est l'approche sans déclencheur et sans interrogation pour résoudre ce besoin?
(Le même effet = "insérer / mettre à jour / supprimer se produit dans une table et un script python est déclenché dans les 2 secondes suivant l'événement db, sans interroger la table")
la source
Réponses:
Ne faites pas attendre votre transaction utilisateur pour la réussite (espérons-le!) Du script Python. Votre transaction entière se trouve là et attend que ce processus externe s'exécute, essaie d'envoyer du courrier, etc. Je doute que l'e-mail doive vraiment sortir à cet instant - d'autant plus que vous ne pouvez pas contrôler les retards qu'il a lorsqu'il est routé dans la boîte de réception du destinataire de toute façon. Pourquoi ne pas simplement exécuter le processus plus fréquemment, si le timing est si important?
Veuillez consulter cette astuce .
Si vous voulez vraiment, vraiment, vraiment faire cela dans le mauvais sens, vous pouvez simplement activer
xp_cmdshell
et déclencher.Maintenant, en supposant que l'utilisateur a accès
xp_cmdshell
et / ou que le compte de service SQL Server puisse voir le dossier où le script python est stocké, vous devriez pouvoir le faire à partir de votre déclencheur:Soit dit en passant, vous devez déclarer dans votre question que vous savez que c'est une très mauvaise chose TM , mais vous n'êtes pas concerné par cela, pour quelque raison que ce soit. Je ne pense toujours pas que vous obtiendrez le temps réel que vous attendez, même si vous déclenchez cela depuis la gâchette. Avez-vous pensé au courrier de base de données au lieu de python?
la source
Tout d'abord, si vous utilisez un déclencheur pour écrire un message dans une table dédiée à cet effet, vous pouvez exécuter en continu le processus de regroupement avec une attente de 1 seconde, voire moins. L'essentiel est de rendre la requête d'interrogation suffisamment bon marché (<1 ms), et de ne pas interférer avec toute autre transaction (donc la "table de file d'attente" dédiée).
EG, demandez à votre processus d'interrogation d'exécuter un lot comme celui-ci:
Attendre jusqu'à 25 secondes pour qu'une ligne apparaisse dans le tableau, interrogation toutes les secondes. À l'expiration, il renvoie simplement un ensemble de résultats vide.
La chose la plus simple consiste alors à utiliser Service Broker, ainsi qu'une procédure d'activation interne qui appelle le Python via xp_cmdshell, ou un processus externe qui boucle sur un blocage RECEIVE sur la file d'attente du service broker cible. C'est ainsi que Database Mail fonctionne sous le capot.
la source
Pour minimiser l'impact de l'exécution synchrone du script Python à partir de votre déclencheur, vous pouvez encapsuler votre code Python dans un
BaseHTTPServer
:Vous pouvez ensuite envoyer une requête HTTP depuis votre déclencheur vers le démon ci-dessus, comme illustré par exemple dans ce SO Q&A . Le gestionnaire de requêtes peut même générer un thread distinct pour exécuter votre logique Python de manière asynchrone.
la source