הרצת קוד SQL ב-Python

15/07/2017

תגיות: , , ,
אין תגובות

לפני מספר שבועות פרסמתי את הפוסט הרצת קוד Python ב-SQL Server oשעסק ביכולת החדשה בגרסת 2017 הבעל”ט לשלב Python בתוך TSQL,
והפעם נעסוק בצד השני המתרס – כיצד פונים מ-Python ל-SQL Server לצורך שליפה או עדכון.
נתחיל בשליפה:

import pyodbc

con = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};PORT=1433;SERVER=tcp:teddicq7nm.database.windows.net,1433;PORT=1443;DATABASE=GeriReshefDB;UID=Ana;PWD=p@$$w0rD_p@$$w0rD')

cursor = con.cursor()

cursor.execute("Select * From T_Log;")

Cr = cursor.fetchall()

cursor.close()

con.close()

print(Cr)

#I=0

#while (I<;len(Cr)-1):

#    print(str(Cr[0]) + " " + str(Cr[1]))

#    I+=1 

בשל רגישותו של Python להזחה (אינדנטיזציה) – יש לוודא שהשורות מוזחות באופן תקין.
הסט מועבר לתוך list בשם row.
במקרה זה אני מדפיס את כל ה-list בלי להתעכב על ענייני עיצוב רק כדי להמחיש שהנתונים נקראו. אני משער שאם מישהו שולף מידע ל-list זה כדי לטפל בו בצורה כלשהי. מי שרוצה לעבור שורה-שורה הקטע המוער יעשה זאת.

פעולת Insert:

import pyodbc

con = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};PORT=1433;SERVER=tcp:teddicq7nm.database.windows.net,1433;PORT=1443;DATABASE=GeriReshefDB;UID=Ana;PWD=p@$$w0rD_p@$$w0rD')

cursor = con.cursor()

cursor.execute("Insert Into T_Log(Txt) Values('Python');")

con.commit()  

cursor.close()

con.close()

Python פותח explicit transaction, ולכן אם לא נבצע commit – הטרנזקציה תבצע rollback.

פעולת Update עם פרמטרים ופלט חיווי כשהפעולה נגמרת בהצלחה:

import pyodbc

con = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};PORT=1433;SERVER=tcp:teddicq7nm.database.windows.net,1433;PORT=1443;DATABASE=GeriReshefDB;UID=Ana;PWD=p@$$w0rD_p@$$w0rD')

Cr = con.cursor()

tsql = "Update T_Log Set Txt=? Where Txt=?;"

with Cr.execute(tsql,'Python Updated','Python'):

    print ('Successfuly Updated!')

con.commit()

Cr.close()

con.close()

הרצת פרוצדורה שמחזירה set ומעבר בלולאה על השורות:

import pyodbc

con=pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};PORT=1433;SERVER=tcp:teddicq7nm.database.windows.net,1433;PORT=1443;DATABASE=GeriReshefDB;UID=Ana;PWD=p@$$w0rD_p@$$w0rD')

Cr=con.cursor()

SP="Exec P1 1033;"

for I in Cr.execute(SP):

    print(str(I[0]))

Cr.close()

con.close()

ולבסוף – מה קורה עם פרוצדורה שמקבלת Table Value parameter?
אין לכך תמיכה ב-Python ולכן צריך לאלתר פתרון:
במקום להכניס סט ערכים לאובייקט של Python ואותו להעביר כפרמטר ל-SQL Server,
אנחנו נעביר ל-SQL Server קוד TSQL שכולל יצירת משתנה טבלה, הכנסת נתונים לתוכו, והפעלת הפרוצדורה:

import pyodbc

con=pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};PORT=1433;SERVER=tcp:teddicq7nm.database.windows.net,1433;PORT=1443;DATABASE=GeriReshefDB;UID=Ana;PWD=p@$$w0rD_p@$$w0rD')

Cr=con.cursor()

sql ="Declare @Txt As Txt; Insert Into @Txt Values('A1'),('A2'),('A3'); Exec P_Log01_Txt @Txt;"

Cr.execute(sql)

con.commit() 

Cr.close()

con.close()

בפועל נוכל לבנות את מחרוזת ה-TSQL מ-List באופן דינאמי.
לא הכי אלגנטי, אבל עובד.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *