140 likes | 420 Vues
PostgreSQL. עבודה עם שרת PostgreSQL : PSQL – מפענח שורת פקודה LIBPQ – ספריית C WebDB – ממשק מבוסס Web (לסטודנטים של הקורס) (כרגע יש בעייה בממשק. בנוסף לטבלאות של החשבון הוא מציג את כל הטבלאות הפנימיות שאינן ניתנות לשינוי.) חשבונות:
E N D
PostgreSQL עבודה עם שרת PostgreSQL: PSQL – מפענח שורת פקודה LIBPQ – ספריית C WebDB – ממשק מבוסס Web (לסטודנטים של הקורס) (כרגע יש בעייה בממשק. בנוסף לטבלאות של החשבון הוא מציג את כל הטבלאות הפנימיות שאינן ניתנות לשינוי.) חשבונות: חשבון csl1 עליו יתבצע התרגיל הרטוב וגישה למפענח שורת פקודה חשבון במסד הנתונים לגישה דרך PSQL או WebDB פרטים נוספים ב-F.A.Q. באתר DBMS - 236363, PostgreSQL
PSQL – מפענח שורת פקודה גישה ל- client של PostgreSQL – מפענח שורת הפקודה: הגישה נעשת ע"י חיבור ssh ל-csl1 ומשם התחברות. התחברות: בהנחה ששם המשתמש שלכם הוא usr יש להקיש: psql usr usr (השימוש הראשון ב-usr הוא עבור שם המסד נתונים שלכם. השימוש השני הוא עבור שם המשתמש) תופיעה בקשה לסיסמא (סיסמא ל-PostgreSQL) Password: xxxxxxxx עכשיו אתם בתוך מפענח שורת הפקודה של PostgreSQL usr=> יציאה: usr=> \q DBMS - 236363, PostgreSQL
PSQL – פקודות פנימיות פקודות פנימיות של המפענח: usr=> \? – קבלת רשימה של הפקודות usr=> \h select – selectקבלת עזרה על פקודת usr=> \q – יציאה מהמפענח usr=> \d – קבלת רשימת טבלאות usr=> \d person– personקבלת מידע על טבלת DBMS - 236363, PostgreSQL
PSQL – פקודות SQL הרצת פקודות SQL: usr=> SELECT Year, COUNT(Book_Id) usr=> FROM Books usr=> GROUP BY Year usr=> HAVING AVG(Pages) > 400; DBMS - 236363, PostgreSQL
LIBPQ – ספריית פונקציות C שימוש בפונקציות של LIBPQ בתוכנית C: #include <libpq-fe.h> הידור וקישור התוכנית: gcc -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -o try try.c לפני הרצת התוכנית משורת הפקודה: מתוך bash יש לרשום: LD_LIBRARY_PATH=/usr/local/pgsql/lib export LD_LIBRARY_PATH מתוך csh או tcsh יש לרשום: setenv LD_LIBRARY_PATH /usr/local/pgsql/lib רצוי אף להוסיף את הפקודות האלה ל- ~/.cshrc DBMS - 236363, PostgreSQL
שלד של תוכנית C המשתמשת ב-LIBPQ בתחילת התוכנית: PGconn *conn; int main(void) { /* Make a connection to the DB. If parameters omitted, default values are used */ conn = PQconnectdb("host=pgsql.cs.technion.ac.il " "dbname=usr user=usr password=pass"); /* check to see that the backend connection was successfully made */ if (!conn || PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr, "Connection to server failed: %s\n", PQerrorMessage(conn)); PQfinish(conn); return 1; } … DBMS - 236363, PostgreSQL
LIBPQ: שלד של תוכנית C – המשך בסיום התוכנית: … /* Close the connection to the database and cleanup */ PQfinish(conn); return 0; } DBMS - 236363, PostgreSQL
LIBPQ: ביצוע שאילתות/פקודות SQL ביצוע שאילתות/פקודות SQL: PQexec() PGresult *res; … res = PQexec(conn, "SELECT BOOK_NAME, ORDER_DATE " "FROM ORDERED WHERE CUST_ID=123456"); if(!res || PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "Error executing query: %s\n", PQresultErrorMessage(res)); PQclear(res); return; } … DBMS - 236363, PostgreSQL
LIBPQ: PQexec() – המשך שימוש במחרוזת עזר: char cmd[200]; int cust_id; /* … */ cust_id = 20; /* could be result of some input or computation */ sprintf(cmd, "SELECT BOOK_NAME, ORDER_DATE " "FROM ORDERED WHERE CUST_ID=%d", cust_id); res = PQexec(conn, cmd); /* … */ שימו לב! יש לוודא שב-cmd יש מספיק מקום בשביל להכיל את הפקודות! DBMS - 236363, PostgreSQL
LIBPQ: בדיקת תוצאה של שאילתה ערך מוחזר מפונקציה PQresultStatus(): עבור שאילתה ("SELECT ..."): PGRES_TUPLES_OK – השאילתה הצליחה אחרת – השאילתה נכשלה עבור פקודות אחרות (DML/DDL): PGRES_COMMAND_OK – הפקודה הצליחה אחרת – הפקודה נכשלה שימו לב: יצירת מבט היא פקודת DDL, ולא שאילתה! DBMS - 236363, PostgreSQL
LIBPQ: שליפת רשומות של תוצאה במידה והשאילתה הצליחה, נוכל לשלוף מידע מהתוצאה: int PQntuples(res) : מס' הרשומות (שורות) בתוצאה (יכול להיות 0) int PQnfields(res): מספר השדות (עמודות) בתוצאה char *PQfname(res, field_index): שם השדה לפי מספר (החל מ-0) int PQfnumber(res, field_name): מספר השדה לפי שם char *PQgetvalue(res, tup_num, field_num): תוכן השדה המתאים בתוצאה int PQgetisnull(res, tup_num, field_num): NULL מחזיר 1 אם השדה הוא void PQclear(res): משחרר את המשאבים שהוקצו לתוצאה אם PQexec() לא הצליחה, נוכל לקבל תאור מילולי של השגיאה: char *PQresultErrorMessage(res) DBMS - 236363, PostgreSQL
LIBPQ: דוגמא דוגמא: בכל שנה יש להציג את מספר הספרים שיצאו לאור באותה שנה (ללא שימוש ב-GROUP BY) int books_by_year(PGconn *conn){ PGresult *res_year, *res_num; int i, year; char query[120]; res_year = PQexec(conn, "SELECT DISTINCT YEAR FROM BOOKS"); if(!res_year || PQresultStatus(res_year) != PGRES_TUPLES_OK){ fprintf(stderr, "Error executing query: %s\n", PQresultErrorMessage(res_year)); PQclear(res_year); return -1; } DBMS - 236363, PostgreSQL
LIBPQ: דוגמא – המשך for(i=0;i<PQntuples(res_year);i++){ year = atoi(PQgetvalue(res_year,i,0)); sprintf(query, "SELECT COUNT(DISTINCT BOOK_NAME) " "FROM BOOKS WHERE YEAR = %d", year); res_num = PQexec(conn,query); if(!res_num || PQresultStatus(res_num) != PGRES_TUPLES_OK){ fprintf(stderr, "Error executing query: %s\n", PQresultErrorMessage(res_num)); PQclear(res_num); PQclear(res_year); return -1; } printf("YEAR=%d Num.Books=%s\n", year, PQgetvalue(res_num,0,0)); PQclear(res_num); } PQclear(res_year); return 0; } DBMS - 236363, PostgreSQL
WebDB:http://pgsql.cs.technion.ac.il:8888/webdb/ כרגע יש בעייה בממשק. בנוסף לטבלאות של החשבון הוא מציג את כל הטבלאות הפנימיות שאינן ניתנות לשינוי. DBMS - 236363, PostgreSQL