Khởi chạy một kịch bản python từ một trình kích hoạt chèn


10

Chúng tôi có một mảnh trăn đẹp gửi một số email và tương tác với một hệ thống đám mây. Hoạt động tốt. Nhưng chúng tôi phải bắn nó cứ sau vài phút để thăm dò db. Chúng tôi thực sự cần, cho mục đích kinh doanh, để kịch bản python bùng cháy trong thời gian thực, do đó không có sự chậm trễ bỏ phiếu. (Điều này phục vụ những người bán hàng đang nói chuyện điện thoại với khách hàng.)

Chúng tôi thực sự không muốn một vòng bỏ phiếu 1 phút. Hoặc 30 giây. Chúng tôi muốn bản ghi hiển thị trong db và cho mọi thứ xảy ra ngay lập tức.

Cách nhanh nhất để thực hiện con ruồi này là bắn nó khi một loại bản ghi cụ thể được chèn vào bảng.

Chúng ta có thể bắn một kịch bản python từ một kích hoạt?

Theo ghi chú của Aaron bên dưới, chúng tôi biết rằng đây là một điều rất tệ , nhưng bảng này được sử dụng rất ít (0-12 chèn mỗi ngày). Bỏ phiếu không đáp ứng nhu cầu kinh doanh của chúng tôi (chúng tôi cần .py để chạy ngay lập tức - nó còn hơn cả gửi email).

Chúng tôi tin rằng một cách để đáp ứng nhu cầu kinh doanh của chúng tôi là thiết lập phiên bản .net của python trên SQL Server và sau đó T-SQL gọi kịch bản python theo cách nó gọi là công cụ C # ... nhưng chúng tôi không biết làm thế nào để thực sự làm điều này (ergo câu hỏi này).

Tài liệu / chi tiết?


Tôi đã hỏi một câu hỏi tiếp theo về Stack Overflow: Làm cách nào để tạo thủ tục CLR Python trong SQL Server?


Câu hỏi dưới câu hỏi : Bạn có một miếng trăn. Bạn muốn nó kích hoạt từ trình kích hoạt SQL, nhưng bạn biết đó là một điều rất tệ. Vậy bạn phải làm gì để thực sự đạt được hiệu ứng tương tự mà không cần có mã python ở giữa một hoạt động SQL?

Cách tiếp cận không kích hoạt, không bỏ phiếu để giải quyết nhu cầu này là gì?

(Hiệu ứng tương tự = "chèn / cập nhật / xóa xảy ra trong một bảng và tập lệnh python được kích hoạt trong vòng 2 giây của sự kiện db, mà không bỏ phiếu cho bảng")


Bạn đang thay đổi câu hỏi năm năm sau? Đầy mâu thuẫn. Bỏ phiếu không đáp ứng nhu cầu kinh doanh của bạn vì py cần chạy ngay lập tức, nhưng trong bản cập nhật bạn nói độ trễ 2 giây có được chấp nhận không? Gây nhầm lẫn. Nếu độ trễ 2 giây là chấp nhận được thì tôi nghĩ đó là bỏ phiếu.
Aaron Bertrand

1
@AaronBertrand Tôi đồng ý rằng câu hỏi này không phù hợp với quan điểm của mọi người về thực tế. Nhưng nếu chúng ta dành một chút thời gian và cho rằng người hỏi là thông minh và chân thành trong nhu cầu của anh ta về một nhiệm vụ không thực tế-kích hoạt-nhưng-hành động giống như kích hoạt, chúng ta (với tư cách là một cộng đồng SE) có thể giúp tìm ra cách fwd (hoặc loại bỏ câu hỏi, điều này không thực sự làm cho nhu cầu / vấn đề biến mất). fwiw.
Jonesome phục hồi Monica

Điều đó tốt, nhưng bạn phải chọn vấn đề nào cần giải quyết, sau đó sửa câu hỏi (hoặc có thể bắt đầu một câu hỏi mới nếu câu trả lời bạn nhận được 5 năm trước có thể chấp nhận được nhưng hôm nay không còn chấp nhận được nữa, cho dù đó là vì yêu cầu của bạn đã thay đổi ). Hiện tại bạn nói rằng bạn không muốn bỏ phiếu hoặc kích hoạt và bạn cũng nói rằng nó phải ngay lập tức trì hoãn 2 giây là ổn.
Aaron Bertrand

Bây giờ, đây là một kịch bản, trong đó NoQuery không tiện dụng không giống như DBMS, vì DBMS có thể quản lý các trình kích hoạt và đóng góp dưới dạng một lớp ứng dụng (hơn cả một bộ lưu trữ dữ liệu)
trao đổi quá mức vào

@samsmith Bạn đã trải qua câu trả lời này chưa?
trao đổi quá mức

Câu trả lời:


12

Đừng khiến giao dịch người dùng của bạn chờ đợi (hy vọng!) Hoàn thành thành công tập lệnh Python. Toàn bộ giao dịch của bạn nằm ở đó và chờ quá trình bên ngoài này chạy, cố gắng gửi thư, v.v ... Tôi nghi ngờ e-mail thực sự phải ra ngoài ngay lập tức - đặc biệt là bạn không thể kiểm soát bất kỳ sự chậm trễ nào khi nó bị chuyển đến hộp thư đến của người nhận nào. Tại sao không chỉ chạy quá trình thường xuyên hơn, nếu thời gian là rất quan trọng?

Xin vui lòng cho xem mẹo này .

Nếu bạn thực sự, thực sự, thực sự muốn làm điều này sai cách, bạn có thể kích hoạt xp_cmdshellvà bắn đi.

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO

Bây giờ, giả sử người dùng có quyền truy cập xp_cmdshellvà / hoặc tài khoản dịch vụ SQL Server có thể thấy thư mục nơi tập lệnh python được lưu trữ, bạn sẽ có thể thực hiện việc này từ bên trong trình kích hoạt của mình:

EXEC master..xp_cmdshell N'C:\Python27\python.exe C:\source\NotifyAgents.py';

Bên cạnh đó, bạn nên nêu trong câu hỏi của bạn rằng bạn biết rằng đây là một điều rất tệ TM , nhưng bạn không quan tâm đến điều đó, vì bất kỳ lý do gì. Tôi vẫn không nghĩ rằng bạn sẽ có được thời gian thực như bạn mong đợi, ngay cả khi bạn bắn nó từ cò súng. Bạn đã xem xét thư cơ sở dữ liệu thay vì python?


Aaron, tất cả các điểm của bạn là hợp lệ, nhưng đó là vấn đề của tôi. Tôi muốn bắn trăn từ một cò súng, và tôi không có vấn đề gì với các vấn đề. (Tôi có thể có kích hoạt trên bàn thực đẩy một giá trị vào một "công việc" bảng và kích hoạt vào "công việc" bảng chạy python ...)
Jonesome Khôi phục Monica

4
Ngoài ra, trình kích hoạt của bạn -> bảng khác -> ý tưởng kích hoạt khác vẫn gặp phải vấn đề tương tự, chỉ bây giờ nó còn tệ hơn. Giao dịch ban đầu vẫn phải chờ cho tất cả hoạt động xếp tầng đó hoàn thành.
Aaron Bertrand

cuộc gọi tốt RE xếp tầng vấn đề. Đừng đến đó!
Jonesome phục hồi Monica

OP tăng cường, để điều chỉnh lại câu hỏi
Jonesome Rebstate Monica

2

"Chèn / cập nhật / xóa xảy ra trong một bảng và tập lệnh python được kích hoạt trong vòng 2 giây kể từ sự kiện db,

Trước hết, nếu bạn sử dụng trình kích hoạt để viết tin nhắn vào bảng dành riêng cho mục đích này, bạn có thể liên tục chạy quy trình gộp với thời gian chờ 1 giây hoặc thậm chí ít hơn. Điều quan trọng là làm cho truy vấn bỏ phiếu đủ rẻ (<1ms) và không can thiệp vào bất kỳ giao dịch nào khác (do đó là "bảng xếp hàng" chuyên dụng).

EG có quá trình bỏ phiếu của bạn chạy một đợt như thế này:

declare @TriesRemaining int = 25
while not exists (select * from queue_table)
begin
  if @TriesRemaining <= 0
    break;
  set @TriesRemaining -= 1
  waitfor delay '0:0:1'
end
delete top (1)  
from queue_table
output deleted.*

Để đợi tối đa 25 giây cho một hàng xuất hiện trong bảng, hãy bỏ phiếu mỗi giây. Khi hết thời gian, nó chỉ trả về một tập kết quả trống.

không bỏ phiếu

Điều đơn giản nhất sau đó là sử dụng Trình môi giới dịch vụ, cùng với Quy trình kích hoạt nội bộ để gọi Python thông qua xp_cmdshell hoặc một quy trình bên ngoài lặp lại để chặn RECEIVE trên hàng đợi của nhà môi giới dịch vụ đích. Đây là cách Database Mail hoạt động dưới mui xe.



2

Để giảm thiểu tác động của việc chạy tập lệnh Python một cách đồng bộ từ trình kích hoạt của bạn, bạn có thể gói mã Python của mình thành BaseHTTPServer:

import BaseHTTPServer

class MyHTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_POST(self):
        print "Serving %s" % self.path
        # Your code here
        self.send_response(200, "OK")

def run(server_class=BaseHTTPServer.HTTPServer,
        handler_class=MyHTTPHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

if __name__ == "__main__":
    run()

Sau đó, bạn có thể gửi yêu cầu HTTP từ trình kích hoạt của mình đến trình nền ở trên, như được hiển thị ví dụ trong Câu hỏi và trả lời SO này . Trình xử lý yêu cầu thậm chí có thể sinh ra một luồng riêng để chạy logic Python của bạn không đồng bộ.


Câu trả lời tốt đẹp !!! Hầu hết các ứng dụng mgr giữa 90 (mà tôi đã làm việc) đã bỏ phiếu cơ sở dữ liệu, với một khoảng thời gian bỏ phiếu.
trao đổi quá mức
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.