Temos um belo pedaço de python que envia alguns emails e interage com um sistema em nuvem. Funciona bem. Mas temos que acioná-lo a cada poucos minutos para pesquisar o banco de dados. Nós realmente precisamos, para fins comerciais, que o script python seja acionado em tempo real, para que não haja atraso na pesquisa. (Isso atende as pessoas de vendas que estão ao telefone com os clientes.)
Realmente não queremos um loop de pesquisa de 1 minuto. Ou 30 segundos. Queremos que o registro seja exibido no banco de dados e que as coisas aconteçam imediatamente.
A maneira mais rápida de fazer essa mosca ser acionada quando um tipo de registro específico é inserido em uma tabela.
Podemos disparar um script python a partir de um gatilho?
De acordo com a nota de Aaron abaixo, sabemos que essa é uma coisa muito ruim ™ , mas essa tabela tem muito pouco uso (0 a 12 inserções por dia). A pesquisa da tabela não atende às nossas necessidades comerciais (precisamos que o .py seja executado imediatamente - ele faz muito mais do que enviar um email).
Acreditamos que uma maneira de atender às nossas necessidades comerciais é configurar a versão .net do python no SQL Server e, em seguida, fazer com que o T-SQL chame o script python da maneira que chama as coisas de C # ... mas não temos idéia de como realmente faça isso! (ergo esta pergunta).
Documentos / detalhes?
Fiz uma pergunta de acompanhamento no estouro de pilha: como criar um procedimento Python CLR no SQL Server?
A questão sob a pergunta : você tem um pedaço de python. Você deseja que ele seja acionado a partir de um gatilho SQL, mas sabe que isso é muito ruim. Então, o que você faz para realmente obter o mesmo efeito sem ter código python no meio de uma operação SQL?
Qual é a abordagem não acionadora e não sondadora para resolver essa necessidade?
(O mesmo efeito = "inserir / atualizar / excluir acontece em uma tabela e um script python é acionado dentro de 2 segundos do evento db, sem consultar a tabela")
fonte
Respostas:
Não faça sua transação de usuário aguardar a (com sorte!) Conclusão bem-sucedida do script Python. Toda a sua transação fica lá e aguarda a execução desse processo externo, tente enviar e-mails etc. Duvido que o e-mail realmente tenha que sair naquele instante - especialmente porque você não pode controlar os atrasos que tem ao ser roteado de qualquer maneira para a caixa de entrada do destinatário. Por que não apenas executar o processo com mais frequência, se o tempo é tão importante?
Por favor, dê uma olhada nesta dica .
Se você realmente, realmente, realmente deseja fazer isso da maneira errada, basta ativar
xp_cmdshell
e disparar.Agora, supondo que o usuário tenha acesso
xp_cmdshell
e / ou a conta de serviço do SQL Server possa ver a pasta em que o script python está armazenado, você poderá fazer isso de dentro do seu gatilho:Como um aparte, você deve declarar na sua pergunta que está ciente de que isso é uma coisa muito ruim da MT , mas não está preocupado com isso, por qualquer motivo. Ainda acho que você não terá o tempo real que espera, mesmo se disparar isso do gatilho. Você considerou o correio do banco de dados em vez do python?
fonte
Primeiro, se você usar um gatilho para escrever uma mensagem em uma tabela dedicada para esse fim, poderá executar continuamente o processo de pool com uma espera de 1 segundo ou até menos. A chave é tornar a consulta de pesquisa barata o suficiente (<1ms) e não interferir em nenhuma outra transação (portanto, a "tabela de fila" dedicada).
Por exemplo, seu processo de votação executa um lote como este:
Para esperar até 25 segundos para que uma linha apareça na tabela, sondando a cada segundo. Com o tempo limite, ele simplesmente retorna um conjunto de resultados vazio.
A coisa mais simples, então, é usar o Service Broker, juntamente com um Procedimento de Ativação Interna que chama o Python através de xp_cmdshell, ou um processo externo que faz um loop em um RECEIVE bloqueador na fila do broker de serviço de destino. É assim que o Database Mail funciona oculto.
fonte
Para minimizar o impacto da execução do script Python de forma síncrona a partir do seu gatilho, você pode agrupar seu código Python em
BaseHTTPServer
:Em seguida, você pode enviar uma solicitação HTTP do seu gatilho para o daemon acima, conforme mostrado, por exemplo, nesta SO Q&A . O manipulador de solicitações pode gerar um thread separado para executar sua lógica Python de forma assíncrona.
fonte