Πώς μπορούμε να κάνουμε μετάφραση πεδιών στον SQL Server με χρήση Python (χωρίς API)
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Η Python σαν scripting language δίνει απεριόριστες δυνατότητες για αυτοματισμούς. Στο άρθρο αυτό θα δούμε πως σε συνεργασία με τον SQL Server γίνεται να μεταφράσουμε μέσα από το google translate πεδίο ολόκληρου πίνακα στα Ελληνικά με ένα κλικ.
Πρώτα θα πρέπει να ανοίξουμε το site με το chrome στο https://translate.google.gr/?hl=el .
Στο καθένα από τα δυο κουτία του source κειμένου και της μετάφρασης κάνουμε: δεξί κλικ – Inspect – Copy – Copy xPath και κρατάμε τις 2 τιμές.
Στην περίπτωση μας είναι:
input_box = '//*[@id="source"]' output_box='/html/body/div[3]/div[2]/div[1]/div[2]/div[1]/div[1]/div[2]/div[3]/div[1]/div[2]/div/span[1]/span'
Στον SQL Server φτιάχνουμε τον πίνακα που θα κάνουμε την δοκιμή
CREATE TABLE [dbo].[googleit]( [id] [int] IDENTITY(1,1) NOT NULL, [en_text] [varchar](4000) NULL, [gr_text] [varchar](4000) NULL ) GO
Προσθέτουμε δύο τιμές που θέλουμε προς μετάφραση.
insert into dbo.googleit (en_text) values(‘Hello, have a nice day’) insert into dbo.googleit (en_text) values(‘Lets test the possibilities’)
Ενεργοποιούμε τη δυνατότητα στον SQL Server να τρέχει direct cmd script (αυτό το step είναι optional γιατί αν δεν θέλουμε μπορούμε στο τέλος να τρέχουμε το .py file απευθειας και να μην το τρέχει o SQL Server για εμάς).
exec sp_configure 'show advanced option',1 go sp_configure 'xp_cmdshell',1 go reconfigure with override
Στην περίπτωση που θα το τρέχει ο SQL Server Agent. Φτιάχνουμε και ένα Job που θα περιέχει το full path με το όνομα του αρχείου που θα εκτελεί.
π.χ.
"C:\Users\smatzouranis\Desktop\python\python_chrome_automation.py"
Πάμε να δούμε τι πρέπει τώρα να εγκαταστήσουμε για την Python.
Requirements
Download τον chromedrive στο folder που θα είναι το py file με τον κώδικα. (προσοχή θα πρέπει να κατεβάσουμε την αντίστοιχη έκδοση που είναι ο chrome μας): Chromedriver
Στο command prompt με την παρακάτω εντολή μας κάνει εγκατάσταση την python: cmd python
Στο command prompt τρέχουμε τις εντολές αυτές ώστε να εγκατασταθούν τα modules που χρειαζόμαστε:
pip install –U selenium pip install pyodbc
Steps
Αφού είμαστε έτοιμοι φτιάχνουμε ένα αρχείο με όνομα python_chrome_automation.py και αρχίζουμε και γράφουμε τον κώδικά μας που αναφέρετε κάτωθι:
#Για αρχή καλούμε τις βιβλιοθήκες που βάλαμε from selenium import webdriver from selenium.common.exceptions import StaleElementReferenceException import pyodbc,time #Κάνουμε odbc connection με τη βάση βάζοντας τις ανάλογες πληροφορίες conn = pyodbc.connect("Driver={SQL Server};" "Server=SMATZOURANISLP\SQL19;" "Database=translation;" "username=python;" "password=python;" "trusted_connection = yes;") #το path που είναι ο chromedriver chromedriver_location = "C:\\Users\\smatzouranis\\Desktop\\python\\chromedriver" driver = webdriver.Chrome(chromedriver_location) #Το site που θα ανοίξει ο chrome στην προκειμένη περίπτωση το google translate driver.get('https://translate.google.gr/?hl=el') #στις δύο αυτές παραμέτρους το xPath από το κουτί του source και target πεδίου του site που βρήκαμε πριν. input_box = '//*[@id="source"]' output_box = '/html/body/div[3]/div[2]/div[1]/div[2]/div[1]/div[1]/div[2]/div[3]/div[1]/div[2]/div/span[1]/span' cursor = conn.cursor() cursor.execute('select * from googleit') results = cursor.fetchall() update = """update googleit set gr_text=? where id=?""" for i in range(len(results)): try: driver.find_element_by_xpath(input_box).clear() value_in = results[i][1] driver.find_element_by_xpath(input_box).send_keys(value_in) time.sleep(4); translated_text = driver.find_element_by_xpath(output_box).text cursor.execute(update,(translated_text,i+1)) except StaleElementReferenceException: pass conn.commit(); cursor.close(); driver.quit; conn.close(); exit();
Το αποτέλεσμα
Καλώντας τώρα το job μετά από μερικά δευτερόλεπτα ανάλογα το πόσες εγγραφές έχουμε και έπειτα με ένα select στο πίνακα μας εμφάνισε την μετάφραση.
exec msdb.dbo.sp_start_job 'callPythonw' select * from googleit
Μπορούμε και να φτιάξουμε μια procedure που θα καλούμε ώστε να εισάγει το κείμενο που θέλουμε προς μετάφραση και μόλις τελειώσει το job να μας επιστρέψει τα αποτελέσματα.
exec translation.dbo.trans 'its ok for me'
Ο κώδικας της procedure
/* alter procedure trans @text nvarchar(max) = null as set nocount on; --truncate table translation.dbo.googleit; insert into translation.dbo.googleit (en_text) values(@text); exec msdb.dbo.sp_start_job 'callPythonw'; while ((select session_id from msdb.dbo.sysjobactivity with(nolock) where job_id = (select job_id from msdb..sysjobs where name = 'callPythonw') and job_history_id is not null and start_execution_date >= DATEADD(dd, -1, GETDATE()) ) is null) begin waitfor delay '00:00:02' end select top 1 en_text,gr_text from translation.dbo.googleit where en_text=@text go */