אינטגרציה של SDKs ויישומים
שילוב Azure Database עבור PostgreSQL באפליקציות שלך דורש בחירת ספריות לקוח מתאימות, ניהול חיבורים יעיל וטיפול טוב בשגיאות. היחידה הזו מכסה דפוסי אינטגרציה של SDK לפייתון, יחד עם שיטות עבודה מומלצות החלות על שפות תכנות שונות.
הערה
דוגמאות קוד ביחידה זו מדגימות דפוסים לאינטגרציה של PostgreSQL עם היישומים שלך. הספרייה psycopg מתעדכנת לעיתים קרובות. בקרו בתיעוד של psycopg לקבלת הפרטים העדכניים ביותר על ה-API ושיטות עבודה מיטביות.
אינטגרציה בין פייתון ל-psycopg
הספרייה psycopg (גרסה 3) היא המתאם המומלץ ל-PostgreSQL עבור פייתון. הוא מספק ממשקים סינכרוניים וא-סינכרוניים, מאגר חיבורים, ותמיכה מלאה בתכונות PostgreSQL.
התקן את psycopg באמצעות pip עם התוספת הבינארית להגדרה הפשוטה ביותר: pip install "psycopg[binary]". ההתפלגות הבינארית כוללת תלותיות מקומפלות מראש, מה שמונע את הצורך להתקין ספריות לקוח PostgreSQL על מכונת הפיתוח שלך. לפריסות ייצור שבהן צריך לקמפל מול ספריות לקוח PostgreSQL ספציפיות, התקן בלי התוספת הבינארית וודא libpq שכותרות פיתוח זמינות.
צור חיבורים באמצעות psycopg.connect() מחרוזת חיבור או פרמטרים בודדים. מחרוזות חיבור נוחות לקבצי קונפיגורציה, בעוד שפרמטרים בודדים מציעים גמישות לחישוב ערכים תכנותית, כמו שליפת סיסמאות מ-Key Vault:
import psycopg
# Connection string format
conn = psycopg.connect("postgresql://user:password@myserver.postgres.database.azure.com/mydb?sslmode=require")
# Individual parameters
conn = psycopg.connect(host="myserver.postgres.database.azure.com", dbname="mydb",
user="myuser", password="mypassword", sslmode="require")
מנהלי הקשר דואגים שהחיבורים ייסגרו כראוי, גם כאשר מתרחשות חריגות. הבלוק החיצוני with מנהל את החיבור, והבלוק הפנימי with מנהל את הסמן:
with psycopg.connect(connection_string) as conn:
with conn.cursor() as cur:
cur.execute("SELECT * FROM conversations WHERE id = %s", (conversation_id,))
row = cur.fetchone()
תמיד השתמש בשאילתות עם פרמטר כדי למנוע התקפות הזרקת SQL. שאילתות פרמטריות מפרידות בין מבנה SQL לערכי הנתונים, ומאפשרות לדרייבר של מסד הנתונים לטפל בבריחה נכונה. השתמש %s במשאבים זמניים לפרמטרים מיקומיים או %(name)s לפרמטרים עם שם. לעולם אל תשתמש בעיצוב מחרוזות או בשרשור כדי לבנות שאילתות עם קלט משתמש.
שלף תוצאות שאילתות באמצעות שיטות סמן התואמות לצרכים שלך. השתמש fetchone() כשאתה מצפה לשורה אחת, fetchall() לתוצאות קטנות, ולחזור ישירות מעל הסמן לתוצאות גדולות כדי לא לטעון הכל לזיכרון בבת אחת.
שיטות עבודה מומלצות לניהול חיבורים
ניהול חיבורים יעיל משפר את אמינות וביצועים האפליקציה ללא קשר לשפת התכנות שבה אתה משתמש.
קבע זמני זמן מתאימים כדי למנוע מהאפליקציה שלך להיתקע כאשר מסד הנתונים אינו נגיש או כאשר השאילתות ארוכות מהצפוי. זמני חיבור שולטים כמה זמן הלקוח מחכה להקים חיבור, בעוד שזמני פקודות מגבילים את זמן ביצוע השאילתה. בחר ערכי טיימפאוט בהתבסס על סבילות האפליקציה שלך להשהיה — יישומי ווב בדרך כלל משתמשים בזמני זמן קצרים יותר (חמש עד 30 שניות) מאשר עבודות עיבוד אצווה.
conn = psycopg.connect(
connection_string,
connect_timeout=10,
options="-c statement_timeout=30000" # milliseconds
)
מיישם לוגיקת ניסיון חוזר עם חזרה אקספוננציאלית כדי להתמודד עם כשלים חולפים כתוצאה מבעיות רשת, הפעלה מחדש של שרת או מאבק במשאבים. תפוס OperationalError אם יש תקלות בחיבור ובפסק זמן. אל תנסו שוב על הפרות מגבלות או שגיאות תחביר—אלה דורשות שינויים בקוד, לא חזרות.
תמיד קשרים קרובים כשאתה מסיים איתם. חיבורים דולפים מבזבזים את מאגר החיבורים ויכולים למנוע חיבורים חדשים. מנהלי הקשר מספקים ניקוי אוטומטי שעובד גם כאשר מתרחשות חריגות.
אסטרטגיות טיפול בשגיאות
פעולות מסד נתונים עלולות להיכשל מסיבות שונות. טיפול נכון בשגיאות משפר את חוויית המשתמש ומפשט את ניפוי השגיאות.
כשלים בחיבור מתרחשים כאשר השרת אינו נגיש או דוחה את החיבור—בעיות רשת, פרטי מידע שגויים, כללי חומת אש או תחזוקת שרת יכולים להיות כל הגורמים לכך. טפל בכשלים בחיבור על ידי רישום פרטים לצורך פתרון תקלות תוך הצגת הודעות ידידותיות למשתמשי הקצה.
אילוצים ייחודיים, מפתחות זרים ומגבלות בדיקה מעלים שגיאות ספציפיות כאשר מפרים אותן. תפוס UniqueViolation, ForeignKeyViolation, ולספק CheckViolation משוב משמעותי. תמיד החזיר את העסקה לאחור לאחר הפרת מגבלות.
קיפאון מתרחש כאשר שתי עסקאות מחכות לנעילה זו של זו, וכך נוצרת תלות מעגלית. PostgreSQL מזהה אוטומטית קיפאון ומסיים עסקה אחת. הבקשה שלך אמורה להיתפס DeadlockDetected, לחזור אחורה ולנסות שוב. כדי למזער את סיכון הקיפאון, תכננו עסקאות לרכישת מנעולים בסדר עקבי. תטפל LockNotAvailable באותו אופן כששאילתות מתיישבות למנעולים.
שיקולי ביצועים
דפוסים ברמת היישום יכולים להשפיע משמעותית על ביצועי מסד הנתונים.
הכנס מספר שורות בפקודה אחת במקום לבצע הכנסות בודדות בלולאה. פעולות אצווה מפחיתות נסיעות הלוך ושוב ברשת, ומשפרות משמעותית את קצב התפוקה של פעולות נתונים בכמויות גדולות. משמש executemany להוספת מאות עד כמה אלפי שורות. עבור מערכי נתונים גדולים יותר (10,000+ שורות), הפקודה COPY מספקת את הביצועים הגבוהים ביותר, לעיתים פי שניים עד עשר מהירים יותר מהוספות בודדות:
with cur.copy("COPY messages (conversation_id, role, content) FROM STDIN") as copy:
for record in records:
copy.write_row(record)
הצהרות מוכנות יכולות לשפר ביצועים עבור שאילתות שבוצעו שוב ושוב עם פרמטרים שונים. מסד הנתונים מנתח ומתכנן את השאילתה פעם אחת, ואז משתמש בתוכנית הזו מחדש. רוב דרייברי PostgreSQL משתמשים אוטומטית בפקודות מוכנות לשאילתות פרמטריות.
יצירת חיבורים חדשים למסדי נתונים יקרה—כל אחת דורשת לחיצות רשת, אימות והקצאת משאבים בצד השרת. השתמש במאגרי חיבורים כדי לשמור על חיבורים רב-פעמיים שהאפליקציה שלך יכולה לשאול ולהחזיר:
from psycopg_pool import ConnectionPool
pool = ConnectionPool(connection_string, min_size=1, max_size=10)
with pool.connection() as conn:
with conn.cursor() as cur:
cur.execute("SELECT * FROM messages WHERE conversation_id = %s", (id,))