10 η Διάλεξη Python Βάσεις δεδομένων στη python
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Η standard διεπαφη της python για βάσεις δεδομένων βασίζεται στο DB-API Python Database API υποστηρίζει ένα ευρύ φάσμα βάσεων δεδομένων GadFly msql MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Πρέπει να κατεβάσουμε ξεχωριστό DB API για κάθε βάση που θέλουμε να προσπελάσουμε Αν θέλουμε να προσπελάσουμε μια βάση της Oracle καθώς και μια βάση της MySQL πρέπει να κατεβάσουμε τα αρθρώματα (DB-API) τόσο για την Oracle όσο και για την MySQL Το DB API μας εφοδιάζει με ένα μίνιμουμ στάνταρντ για να δουλέψουμε με βάσεις χρησιμοποιώντας της δομές της Python και τη σύνταξη της python όπου αυτό είναι δυνατό. Το API περιλαμβάνει τα ακόλουθα: Εισαγωγή (Import) του api module. Σύνδεση με τη βάση. SQL δηλώσεις και διαδικασίες. Κλείσιμο της σύνδεσης MySQLdb είναι μια διεπαφή για την σύνδεση με έναν εξυπηρετητή μιας MySQL database μέσα από τη python.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ας θωρήσουμε μια βάση δεδομένων η οποία θα περιλαμβάνει τα εξής: Ονομάζουμε τη βάση μας «TESTDB» Δημιουργούμε έναν πίνακα στη βάση με όνομα «EMPLOYEE» Ο πίνακας θα έχει τα πεδία: FIRST_NAME, LAST_NAME, AGE, SEX and INCOME. Φτιάχνουμε ένα User ID "testuser" με password "test123" ο οποίος θα έχει πρόσβαση στη βάση Βεβαιωνόμαστε ότι το Python module MySQLdb είναι εγκατεστημένο
Παράδειγμα import MySQLdb # Ανοίγουμε τη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # προετοιμάζουμε έναν αντικείμενο «cursor» χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # εκτελούμε ένα SQL ερώτημα χρησιμοποιώντας τη μέθοδο execute() cursor.execute("select VERSION()") # Ανακτούμε μια γραμμή με τη μέθοδο fetchone() data = cursor.fetchone() print "Database version : %s " % data # αποσύνδεση από το server db.close()
Δημιουργία Πίνακα στη βάση: import MySQLdb # δημιουργία σύνδεσης με τη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # ετοιμάζουμε ένα αντικείμενο «cursor» χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # αν ο πίνακας υπάρχει τον απορρίπτουμε με τη μέθοδο execute() cursor.execute("drop TABLE IF EXISTS EMPLOYEE") # Δημιουργία πίνακα με τα πεδία του sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # αποσύνδεση db.close()
INSERT Τη λειτουργία Insert τη χρησιμοποιούμε όταν θέλουμε να εισάγουμε δεδομένα στη βάση μας: import MySQLdb # Σύνδεση στη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # ετοιμάζουμε ένα αντικείμενο «cursor» χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # φτιάχνουμε ένα ερώτημα SQL χρησιμοποιώντας τη μέθοδο INSERT για να εισάγουμε δεδομένα στη βάση sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # εκτελούμε την εντολή cursor.execute cursor.execute(sql) # αποθηκεύουμε της αλλαγές στη βάση db.commit() except: # επιστροφή στην περίπτωση λάθους db.rollback() # αποσύνδεση db.close()
INSERT Το προηγούμενο παράδειγμα μπορεί να ξαναγραφτεί έτσι ώστε να δημιουργήσουμε ένα δυναμικό sql ερώτημα: import MySQLdb # Σύνδεση στη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # προετοιμασία ενός αντικειμένου cursor με τη μέθοδο cursor() cursor = db.cursor() # Προετοιμασια ερωτήματος SQL για την εισαγωγή εγγραφής στη βάση. sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # εκτέλεση της εντολής cursor.execute(sql) # αποθηκεύουμε της αλλαγές στη βάση db.commit() except: # επιστροφή στην περίπτωση λάθους db.rollback() # αποσύνδεση db.close()
READ Την εντολή read τη χρησιμοποιούμε για να διαβάσουμε πληροφορίες από τη βάση μας. Αφού κάνουμε σύνδεση στη βάση μας και χρησιμοποιούμε μια εκ των δύο μεθόδων που περιγράφονται παρακάτω; fetchone(): κάθε κλήση της μεθόδου θα μας επιστρέψει μια εγγραφή από τη βάση. fetchall(): κάθε κλήση της μεθόδου θα μας επιστρέψει πολλαπλές εγγραφές rowcount: μας επιστρέφει των αριθμό των εγγραφών οι οποίες επηρεάζονται από την εκτέλεση της εντολής execute
READ Παράδειγμα import MySQLdb # Κάνουμε σύνδεση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # προετοιμάζουμε ένα αντικείμενο cursor χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # Προετοιμασία ερωτήματος SQL για να κάνουμε INSERT μια εγγραφή στη βάση. sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # Εκτελούμε την εντολή SQL cursor.execute(sql) # φέρνουμε όλες της εγγραφές σε μια λίστα. results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # τυπώνουμε τις εγγραφές που ανακτήσαμε print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # αποσύνδεση από server db.close()
Update Η λειτουργία update χρησιμοποιείται για την ενημέρωση μιας ήδη υπάρχουσας εγγραφής στη βάση δεδομένων import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to UPDATE required records sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Delete Με την εντολή delete διαγράφουμε εγγραφές από τη βάση μας: import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Performing Transactions Οι συναλλαγές είναι ένας μηχανισμός που εξασφαλίζει τη συνοχή των δεδομένων. Οι συναλλαγές έχουν τέσσερις ιδιότητες: Atomicity (ατομικότητα) : Αν δεν ολοκληρωθεί μια συναλλαγή δεν γίνεται τίποτα στη βάση Consistency (συνοχή) : Μια συναλλαγή πρέπει να ξεκινάει και να τελειώνει με σταθερό σύστημα. Isolation (απομόνωσή): Ενδιάμεσά αποτελέσματα δεν είναι ορατά προς τα έξω Durability (ανθεκτικότητα): Μόλις μια δοσοληψία ολοκληρωθεί τα αποτελέσματα είναι μόνιμα ακόμα και μετά από μια αποτυχία του συστήματος. Το DB API 2.0 της python έχει 2 μεθόδους για να εκτελέσει ή να αναιρέσει μια συναλλαγή με τη βάση δεδομένων
Performing Transactions # Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback()
Commit - Rollback H λειτουργία commit δίνει το τελικό «σήμα» στη βάση δεδομένων να μονιμοποιήσει της όποιες αλλαγές έχουν γίνει πάνω της. Η λειτουργία rollback χρησιμοποιείται για την αναίρεση των αλλαγών σε περίπτωση που δεν είναι ικανοποιητικό το αποτέλεσμά τους