Tenemos una buena pieza de Python que envía algunos correos electrónicos e interactúa con un sistema en la nube. Funciona bien. Pero tenemos que dispararlo cada pocos minutos para sondear la base de datos. Realmente necesitamos, para fines comerciales, que el script de Python se active en tiempo real, por lo que no hay demora en el sondeo. (Esto sirve a los vendedores que están hablando por teléfono con los clientes).
Realmente no queremos un bucle de sondeo de 1 minuto. O 30 segundos Queremos que el registro se muestre en la base de datos y que las cosas sucedan de inmediato.
La forma más rápida de hacer que esta mosca sea activada cuando se inserta un tipo de registro específico en una tabla.
¿Podemos disparar un script de Python desde un disparador?
Según la nota de Aaron a continuación, sabemos que esta es una cosa muy mala ™ , pero esta tabla tiene muy poco uso (0-12 inserciones al día). El sondeo de la tabla no cumple con nuestras necesidades comerciales (necesitamos que .py se ejecute de inmediato; hace mucho más que enviar un correo electrónico).
Creemos que una forma de satisfacer nuestras necesidades comerciales es configurar la versión .net de python en el SQL Server, y luego hacer que T-SQL llame al script de python de la manera en que llama cosas de C # ... pero no tenemos idea de cómo en realidad haz esto! (Ergo esta pregunta).
Documentos / detalles?
Hice una pregunta de seguimiento sobre Stack Overflow: ¿Cómo creo un procedimiento Python CLR en SQL Server?
La pregunta bajo la pregunta : Tienes una pieza de pitón. Desea que se active desde un disparador SQL, pero sabe que es una cosa muy mala. Entonces, ¿qué haces para lograr el mismo efecto sin tener código python en medio de una operación SQL?
¿Cuál es el enfoque sin disparador y sin sondeo para resolver esta necesidad?
(El mismo efecto = "insertar / actualizar / eliminar ocurre en una tabla y se activa un script de Python dentro de los 2 segundos posteriores al evento db, sin sondear la tabla")
fuente
Respuestas:
No haga que su transacción de usuario espere la finalización exitosa (¡con suerte!) Del script Python. Toda su transacción se queda allí y espera a que se ejecute este proceso externo, intente enviar correo, etc. Dudo que el correo electrónico realmente tenga que salir en ese instante, especialmente dado que no puede controlar los retrasos que tiene a medida que se enruta a la bandeja de entrada del destinatario de todos modos. ¿Por qué no simplemente ejecutar el proceso con más frecuencia, si el tiempo es tan importante?
Por favor, dale un vistazo a este consejo .
Si realmente quieres hacer esto de la manera incorrecta, puedes habilitarlo
xp_cmdshell
y disparar.Ahora, suponiendo que el usuario tenga acceso
xp_cmdshell
y / o la cuenta de servicio de SQL Server pueda ver la carpeta donde está almacenado el script de Python, debería poder hacerlo desde su disparador:Como comentario adicional, debe indicar en su pregunta que sabe que esto es algo muy malo TM , pero no le preocupa eso, por cualquier razón. Todavía no creo que vaya a tener el tiempo real que espera, incluso si dispara esto desde el gatillo. ¿Has considerado el correo de la base de datos en lugar de Python?
fuente
En primer lugar, si usa un disparador para escribir un mensaje en una tabla dedicada para este propósito, puede ejecutar continuamente el proceso de agrupación con una espera de 1 segundo, o incluso menos. La clave es hacer que la consulta de sondeo sea lo suficientemente barata (<1 ms) y no interferir con ninguna otra transacción (por lo tanto, la "tabla de cola" dedicada).
Por ejemplo, haga que su proceso de votación ejecute un lote como este:
Para esperar hasta 25 segundos para que aparezca una fila en la tabla, sondear cada segundo. En el tiempo de espera, simplemente devuelve un conjunto de resultados vacío.
Lo más simple es utilizar Service Broker, junto con un Procedimiento de activación interna que invoca Python a través de xp_cmdshell, o un proceso externo que se repite en un RECEIVE de bloqueo en la cola del intermediario de servicios de destino. Así es como funciona el Correo electrónico de base de datos .
fuente
Para minimizar el impacto de ejecutar el script Python sincrónicamente desde su disparador, puede ajustar su código Python en
BaseHTTPServer
:Luego puede enviar una solicitud HTTP desde su disparador al demonio anterior, como se muestra, por ejemplo, en estas preguntas y respuestas sobre SO . El controlador de solicitudes puede incluso generar un hilo separado para ejecutar su lógica de Python de forma asincrónica.
fuente