Meluncurkan skrip python dari pemicu sisipan


10

Kami memiliki sepotong python yang bagus yang mengirim beberapa email dan berinteraksi dengan sistem cloud. Bekerja dengan baik. Tapi kita harus memecatnya setiap beberapa menit untuk polling db. Kami benar-benar perlu, untuk tujuan bisnis, agar skrip python menyala secara real time, sehingga tidak ada penundaan pemungutan suara. (Ini melayani orang penjualan yang bertelepon dengan pelanggan.)

Kami benar-benar tidak ingin putaran polling 1 menit. Atau 30 detik. Kami ingin catatan untuk ditampilkan di db dan untuk hal-hal yang terjadi segera.

Cara cepat untuk membuat lalat ini adalah dengan membuatnya menyala ketika tipe catatan tertentu dimasukkan ke dalam tabel.

Bisakah kita menjalankan skrip python dari pemicu?

Per catatan Harun di bawah ini, kita tahu bahwa ini adalah Very Bad Thing ™ , tetapi tabel ini hanya sedikit digunakan (sisipan 0-12 per hari). Polling tabel gagal memenuhi kebutuhan bisnis kami (kami membutuhkan .py untuk segera berjalan - ini jauh lebih baik daripada mengirim email).

Kami percaya cara untuk memenuhi kebutuhan bisnis kami adalah dengan mengatur .net versi python pada SQL Server, dan kemudian meminta T-SQL memanggil skrip python seperti panggilan C # stuff ... tetapi kami tidak tahu bagaimana caranya sebenarnya lakukan ini! (ergo pertanyaan ini).

Dokumen / detail?


Saya mengajukan pertanyaan tindak lanjut tentang Stack Overflow: Bagaimana cara membuat prosedur Python CLR di SQL Server?


Pertanyaan di bawah pertanyaan : Anda memiliki sepotong python. Anda ingin memecat dari pemicu SQL, tetapi Anda tahu itu adalah hal yang sangat buruk. Jadi apa yang Anda lakukan untuk benar-benar mencapai efek yang sama tanpa memiliki kode python di tengah operasi SQL?

Apa pendekatan non-trigger, non-polling untuk menyelesaikan kebutuhan ini?

(Efek yang sama = "masukkan / perbarui / hapus terjadi dalam sebuah tabel dan skrip python dipicu dalam waktu 2 detik dari peristiwa db, tanpa polling tabel")


Anda mengubah pertanyaan lima tahun kemudian? Penuh konflik. Polling tabel tidak memenuhi kebutuhan bisnis Anda karena py perlu segera dijalankan, tetapi dalam pembaruan Anda mengatakan penundaan 2 detik dapat diterima? Membingungkan Jika penundaan 2 detik dapat diterima maka saya pikir begitu juga polling tabel.
Aaron Bertrand

1
@ AaronBertrand Saya setuju bahwa pertanyaan ini tidak sesuai dengan pandangan semua orang tentang kenyataan. Tetapi jika kita luangkan waktu, dan menganggap si penanya cerdas dan tulus dalam kebutuhannya akan pencarian yang tidak-aktual-pemicu-tetapi-tindakan-seperti-pemicu, kita (sebagai komunitas SE) dapat membantu menemukan jalan fwd (atau mengabaikan pertanyaan, yang sebenarnya tidak membuat kebutuhan / masalah hilang). angsa
Jonesome Reinstate Monica

Tidak apa-apa, tetapi Anda harus memilih masalah mana yang harus dipecahkan, dan kemudian perbaiki pertanyaan (atau mungkin mulai yang baru jika jawaban yang Anda dapatkan 5 tahun yang lalu dapat diterima kemudian tetapi tidak lagi dapat diterima hari ini, apakah itu karena kebutuhan Anda telah berubah sejak saat itu) ). Saat ini Anda mengatakan Anda tidak ingin polling atau pemicu, dan Anda juga mengatakan bahwa itu harus segera dan penundaan 2 detik baik-baik saja.
Aaron Bertrand

Sekarang, ini adalah skenario, di mana NoSQL tidak berguna seperti DBMS, karena DBMS dapat mengelola pemicu dan berkontribusi sebagai lapisan aplikasi (lebih dari penyimpanan data)
overexchange

@samsmith Apakah Anda sudah menjawab ini?
pertukaran berlebihan

Jawaban:


12

Jangan membuat transaksi pengguna Anda menunggu (semoga!) Berhasil menyelesaikan skrip Python. Seluruh transaksi Anda duduk di sana dan menunggu proses eksternal ini berjalan, mencoba mengirim surat, dll. Saya ragu email benar-benar harus keluar seketika itu - terutama mengingat Anda tidak dapat mengontrol keterlambatan yang dimilikinya saat dialihkan to inbox penerima. Mengapa tidak hanya menjalankan proses lebih sering, jika pengaturan waktu begitu penting?

Tolong beri tip ini untuk melihat-lihat .

Jika Anda benar-benar ingin melakukan ini dengan cara yang salah, Anda bisa mengaktifkan xp_cmdshelldan melepaskannya.

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

Sekarang, dengan asumsi pengguna memiliki akses ke xp_cmdshelldan / atau akun layanan SQL Server dapat melihat folder tempat skrip python disimpan, Anda harus dapat melakukan ini dari dalam pemicu Anda:

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

Sebagai samping, Anda harus menyatakan dalam pertanyaan Anda bahwa Anda menyadari bahwa ini adalah hal yang sangat buruk TM , tetapi Anda tidak peduli dengan itu, untuk alasan apapun. Saya masih tidak berpikir Anda akan mendapatkan waktu yang tepat seperti yang Anda harapkan, bahkan jika Anda memecat ini dari pelatuk. Sudahkah Anda mempertimbangkan basis data bukannya python?


Aaron, Semua poin Anda valid, tapi itu masalah saya. Saya ingin memecat python dari pemicu, dan saya tidak punya masalah dengan masalahnya. (Saya dapat memiliki pemicu di meja nyata mendorong nilai ke tabel "pekerjaan", dan pemicu pada tabel "pekerjaan" menjalankan python ...)
Jonesome Reinstate Monica

4
Juga, pemicu Anda -> tabel lain -> ide pemicu lainnya masih mengalami masalah yang sama, hanya saja sekarang lebih buruk. Transaksi asli masih harus menunggu semua aktivitas kaskade selesai.
Aaron Bertrand

panggilan baik RE cascading masalah ini. Tidak akan pergi ke sana!
Jonesome Reinstate Monica

OP ditingkatkan, untuk membingkai ulang pertanyaan
Jonesome Reinstate Monica

2

"masukkan / perbarui / hapus terjadi dalam sebuah tabel dan skrip python dipicu dalam waktu 2 detik dari peristiwa db,

Pertama, jika Anda menggunakan pemicu untuk menulis pesan ke tabel yang didedikasikan untuk tujuan ini, Anda bisa terus menjalankan proses penyatuan dengan menunggu 1sec, atau bahkan kurang. Kuncinya adalah membuat kueri pemungutan suara cukup murah (<1ms), dan tidak mengganggu transaksi lainnya (dengan demikian "tabel antrian" khusus).

EG minta proses polling Anda berjalan seperti ini:

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.*

Untuk menunggu hingga 25 detik agar satu baris muncul di tabel, polling setiap detik. Pada batas waktu itu hanya mengembalikan resultset kosong.

tanpa polling tabel

Yang paling sederhana adalah menggunakan Service Broker, bersama dengan Prosedur Aktivasi Internal yang memanggil Python melalui xp_cmdshell, atau proses eksternal yang loop pada pemblokiran RECEIVE pada antrian broker layanan target. Ini adalah cara kerja Database Mail di bawah tenda.



2

Untuk meminimalkan dampak menjalankan skrip Python secara sinkron dari pemicu Anda, Anda dapat membungkus kode Python Anda menjadi 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()

Anda kemudian dapat mengirim permintaan HTTP dari pemicu Anda ke daemon di atas, seperti yang diperlihatkan misalnya dalam SO T&J ini . Penangan permintaan bahkan dapat menelurkan utas terpisah untuk menjalankan logika Python Anda secara tidak sinkron.


Jawaban bagus!!! Sebagian besar aplikasi mgr pertengahan 90-an (yang saya kerjakan) adalah polling database, dengan interval polling.
pertukaran berlebihan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.