Λογότυπο Zephyrnet

Python και MySQL: Μια πρακτική εισαγωγή για την ανάλυση δεδομένων

Ημερομηνία:

Αυτό το άρθρο δημοσιεύθηκε ως μέρος του Επιστήμη δεδομένων Blogathon

Εισαγωγή

Ας δούμε ένα πρακτικό παράδειγμα του τρόπου δημιουργίας ερωτημάτων SQL σε διακομιστή MySQL από κώδικα Python: ΔΗΜΙΟΥΡΓΙΑ, ΕΠΙΛΟΓΗ, ΕΝΗΜΕΡΩΣΗ, ΣΥΝΔΕΣΗ κ.λπ.

Οι περισσότερες εφαρμογές αλληλεπιδρούν με δεδομένα σε κάποια μορφή. Επομένως, οι γλώσσες προγραμματισμού (η Python δεν αποτελεί εξαίρεση) παρέχουν εργαλεία για την αποθήκευση πηγών δεδομένων και την πρόσβαση σε αυτές. Το MySQL είναι ένα από τα πιο φανταστικά και πλούσια συστήματα διαχείρισης βάσεων δεδομένων (DBMS). Πέρυσι κατατάχθηκε στη δεύτερη θέση μετά την Oracle στην κατάταξη των βάσεων δεδομένων.

Χρησιμοποιώντας τις τεχνικές που περιγράφονται σε αυτό το σεμινάριο, μπορείτε να ενσωματώσετε αποτελεσματικά μια βάση δεδομένων MySQL στην εφαρμογή σας Python. Σε αυτό το σεμινάριο, θα αναπτύξουμε μια μικρή βάση δεδομένων MySQL για ένα σύστημα αξιολόγησης ταινιών και θα μάθουμε πώς να συλλέγουμε δεδομένα από αυτό χρησιμοποιώντας τον κώδικα Python.

Αυτό που θα μάθετε μετά από αυτό το σεμινάριο είναι:

  • Συνδέστε την εφαρμογή σας στη βάση δεδομένων MySQL

  • Ανάκτηση δεδομένων μέσω ερωτήματος για τα απαιτούμενα δεδομένα από τη βάση δεδομένων

  • Χειριστείτε τις εξαιρέσεις που έχουν ληφθεί κατά την πρόσβαση στη βάση δεδομένων

Για να αξιοποιήσετε στο έπακρο αυτό το σεμινάριο, είναι σκόπιμο να έχετε μια εργασιακή γνώση για τις έννοιες της Python, όπως ο κύκλος, οι συναρτήσεις και ο χειρισμός εξαιρέσεων. Πρέπει επίσης να έχετε μια βασική κατανόηση των ερωτημάτων SQL, όπως, και. για SELECT DROP CREATE JOIN

Σύγκριση MySQL με άλλες βάσεις δεδομένων SQL

Η SQL σημαίνει Structured Query Language είναι μια ευρέως χρησιμοποιούμενη γλώσσα προγραμματισμού για τη διαχείριση σχεσιακών βάσεων δεδομένων. Μπορεί να έχετε ακούσει για διάφορα DBMS που βασίζονται σε SQL: MySQL, PostgreSQL, SQLite και SQL Server. Όλες αυτές οι βάσεις δεδομένων συμμορφώνονται με τα πρότυπα SQL αλλά διαφέρουν λεπτομερώς.

Λόγω του κώδικα ανοιχτού κώδικα, η MySQL έγινε γρήγορα ο ηγέτης της αγοράς στις λύσεις SQL. Η MySQL χρησιμοποιείται επί του παρόντος από τις περισσότερες από τις διάσημες εταιρείες τεχνολογίας όπως η Google, το LinkedIn, το Uber, το Netflix, το Twitter και άλλα.

Εκτός από την υποστήριξη από την κοινότητα ανοιχτού κώδικα, υπάρχουν άλλοι λόγοι για την επιτυχία της MySQL:

  1. Εύκολο στην εγκατάσταση- Το MySQL έχει σχεδιαστεί για να είναι φιλικό προς το χρήστη. Η βάση δεδομένων είναι εύκολο να δημιουργηθεί και να προσαρμοστεί. Το MySQL είναι διαθέσιμο για μεγάλα λειτουργικά συστήματα, συμπεριλαμβανομένων των Windows, macOS, Linux και Solaris.

  2. Speed- MySQL έχει τη φήμη ότι είναι μια γρήγορη λύση βάσης δεδομένων. Αυτό το DBMS κλιμακώνεται επίσης καλά.

  3. Δικαιώματα και ασφάλεια χρηστών- Η MySQL σάς επιτρέπει να ορίσετε επίπεδα ασφαλείας κωδικού πρόσβασης, να προσθέσετε και να αφαιρέσετε δικαιώματα σε λογαριασμούς χρηστών. Η διαχείριση δικαιωμάτων χρήστη φαίνεται πολύ απλούστερη από ό, τι σε πολλά άλλα DBMS, όπως το PostgreSQL, όπου η διαχείριση αρχείων διαμόρφωσης απαιτεί κάποια δεξιότητα.

Εγκατάσταση MySQL Server και MySQL Connector

Ο MySQL Server και ο MySQL Connector είναι το μόνο δύο λογισμικό που χρειάζεστε για να ξεκινήσετε με αυτό το σεμινάριο. Ο MySQL Server θα παρέχει τους πόρους που απαιτούνται για να συνεργαστεί με τη βάση δεδομένων. Μετά την εκκίνηση του διακομιστή, θα πρέπει να μπορείτε να συνδέσετε την εφαρμογή Python σε αυτόν χρησιμοποιώντας το MySQL Connector / Python.

Εγκατάσταση MySQL Server

Η επίσημη τεκμηρίωση περιγράφει τους προτεινόμενους τρόπους λήψης και εγκατάστασης του MySQL Server. Υπάρχουν οδηγίες για όλα τα δημοφιλή λειτουργικά συστήματα, συμπεριλαμβανομένων των Windows, macOS, Solaris, Linux και πολλά άλλα.

Για τα Windows, το καλύτερο στοίχημά σας είναι να κατεβάσετε το πρόγραμμα εγκατάστασης MySQL και να το αφήσετε να αναλάβει τη διαδικασία. Ο Διαχειριστής εγκατάστασης θα σας βοηθήσει επίσης να διαμορφώσετε τις ρυθμίσεις ασφαλείας για τον διακομιστή MySQL. Στη σελίδα λογαριασμών, θα χρειαστεί να εισαγάγετε έναν κωδικό πρόσβασης για τον βασικό λογαριασμό και, αν θέλετε, να προσθέσετε άλλους χρήστες με διαφορετικά προνόμια.

Δημιουργία λογαριασμού MySQLΔημιουργία λογαριασμού MySQL

Άλλα χρήσιμα εργαλεία όπως το MySQL Workbench μπορούν να προσαρμοστούν χρησιμοποιώντας τα προγράμματα εγκατάστασης. Μια βολική εναλλακτική λύση για την εγκατάσταση σε ένα λειτουργικό σύστημα είναι η ανάπτυξη MySQL χρησιμοποιώντας το Docker.

Εγκατάσταση MySQL Connector / Python

Πρόγραμμα οδήγησης βάσης δεδομένων - λογισμικό που επιτρέπει σε μια εφαρμογή να συνδέεται και να αλληλεπιδρά με ένα DBMS. Αυτά τα προγράμματα οδήγησης παρέχονται συνήθως ως ξεχωριστές μονάδες. Η τυπική διεπαφή στην οποία πρέπει να συμμορφώνονται όλα τα προγράμματα οδήγησης βάσης δεδομένων Python περιγράφεται στο PEP 249. Για την εγκατάσταση του προγράμματος οδήγησης (σύνδεσμος), θα χρησιμοποιήσουμε τον διαχειριστή πακέτων: pip

pip εγκατάσταση mysql-connector-python

pip θα εγκαταστήσει τη σύνδεση στο τρέχον ενεργό περιβάλλον. Για να εργαστείτε μεμονωμένα με ένα έργο, συνιστούμε τη δημιουργία ενός εικονικού περιβάλλοντος.

Ας ελέγξουμε το αποτέλεσμα της εγκατάστασης εκτελώντας την ακόλουθη εντολή στο τερματικό Python:

εισαγωγή mysql.connector

Εάν η δήλωση εισαγωγής εκτελείται χωρίς σφάλματα, τότε είναι επιτυχώς εγκατεστημένη και έτοιμη για χρήση. MySQL.connector

Δημιουργία σύνδεσης με τον διακομιστή MySQL

Το MySQL είναι ένα σύστημα διαχείρισης βάσεων δεδομένων από την πλευρά του διακομιστή. Ένας διακομιστής μπορεί να περιέχει πολλές βάσεις δεδομένων. Για να αλληλεπιδράσουμε με τη βάση δεδομένων, πρέπει να δημιουργήσουμε μια σύνδεση με τον διακομιστή. Η αλληλεπίδραση βήμα προς βήμα για ένα πρόγραμμα Python με μια βάση δεδομένων που βασίζεται σε MySQL μοιάζει με αυτό:

  1. Συνδεόμαστε με τον διακομιστή MySQL.

  2. Δημιουργούμε μια νέα βάση δεδομένων (εάν είναι απαραίτητο).

  3. Συνδεόμαστε με τη βάση δεδομένων.

  4. Εκτελούμε το ερώτημα SQL, συλλέγουμε τα αποτελέσματα.

  5. Ενημερώνουμε τη βάση δεδομένων εάν έχουν γίνει αλλαγές στον πίνακα.

  6. Τέλος, απλώς κλείστε τη σύνδεση με τον διακομιστή MySQL.

Όποια και αν είναι η εφαρμογή, το πρώτο βήμα είναι να συνδέσετε την εφαρμογή και τη βάση δεδομένων μαζί.

Σύνδεση με MySQL Server από την Python

Για να δημιουργήσετε μια σύνδεση, χρησιμοποιήστε τη μονάδα. Αυτή η συνάρτηση λαμβάνει παραμέτρους και, και επιστρέφει ένα αντικείμενο. Τα διαπιστευτήρια μπορούν να ληφθούν ως αποτέλεσμα της εισόδου από τον χρήστη: connect () mysql.connector password user user MySQLConnection

από getpass εισαγωγή getpass από mysql.connector import connect, Σφάλμα δοκιμής: με connect (host = "localhost", user = input ("Username:"), password = getpass ("Password:"),) ως σύνδεση: print (σύνδεση ) εκτός από Error as e: print (e)

Το αντικείμενο αποθηκεύεται σε μια μεταβλητή που θα χρησιμοποιήσουμε για πρόσβαση στον διακομιστή MySQL. Μερικά σημαντικά σημεία: Σύνδεση MySQLC

  • Τυλίξτε όλες τις συνδέσεις βάσης δεδομένων σε μπλοκ. Αυτό θα διευκολύνει τον εντοπισμό και την εξέταση τυχόν εξαιρέσεων. δοκιμάστε… εκτός

  • Θυμηθείτε να κλείσετε τη σύνδεση αφού ολοκληρώσετε την πρόσβαση στη βάση δεδομένων. Οι αχρησιμοποίητες ανοικτές συνδέσεις οδηγούν σε απροσδόκητα σφάλματα και προβλήματα απόδοσης. Ο κώδικας χρησιμοποιεί το διαχειριστή περιβάλλοντος (με… ως…) για αυτό.

  • Δεν πρέπει ποτέ να ενσωματώνετε διαπιστευτήρια (όνομα χρήστη και κωδικό πρόσβασης) σε μορφή συμβολοσειράς σε ένα σενάριο Python. Αυτή είναι κακή πρακτική ανάπτυξης και ενέχει σοβαρό κίνδυνο ασφάλειας. Ο παραπάνω κώδικας ζητά τα διαπιστευτήριά σας σύνδεσης. Για αυτό, χρησιμοποιείται μια ενσωματωμένη μονάδα για να αποκρύψει τον κωδικό πρόσβασης που έχετε εισαγάγει.

Έτσι, έχουμε δημιουργήσει μια σύνδεση μεταξύ του προγράμματός μας και του διακομιστή MySQL. Τώρα πρέπει είτε να δημιουργήσετε μια νέα βάση δεδομένων είτε να συνδεθείτε με μια υπάρχουσα.

Δημιουργήστε μια νέα βάση δεδομένων

Για να δημιουργήσετε μια νέα βάση δεδομένων, για παράδειγμα με ένα όνομα, πρέπει να εκτελέσετε τη δήλωση SQL: online_movie_rating

ΔΗΜΙΟΥΡΓΙΑ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ online_movie_rating;

Note

Η MySQL απαιτεί από εσάς να βάλετε ένα ερωτηματικό (😉 στο τέλος μιας δήλωσης. Ωστόσο, το MySQL Connector/Python προσθέτει αυτόματα ένα ερωτηματικό στο τέλος κάθε ερωτήματος.

Για να εκτελέσουμε ένα ερώτημα SQL, χρειαζόμαστε έναν δρομέα που να αφαιρεί τη διαδικασία πρόσβασης σε εγγραφές βάσης δεδομένων. Το MySQL Connector / Python παρέχει μια αντίστοιχη κλάση, μια περίπτωση της οποίας ονομάζεται επίσης δρομέας. MySQLCursor

Ας περάσουμε το αίτημά μας για δημιουργία βάσης δεδομένων: online_movie_rating

δοκιμάστε: με τη σύνδεση (host = "localhost", user = input ("Username:"), password = getpass ("Password:"),) as connection: create_db_query = "CREATE DATABASE online_movie_rating" with connection.cursor () as cursor : cursor.execute (create_db_query) εκτός από Σφάλμα ως e: print (e)

Το αίτημα αποθηκεύεται ως συμβολοσειρά σε μια μεταβλητή και στη συνέχεια μεταβιβάζεται για εκτέλεση στη ΔΗΜΙΟΥΡΓΙΑ ΔΕΔΟΜΕΝΩΝ create_db_query cursor.execute ()

Εάν μια βάση δεδομένων με το ίδιο όνομα υπάρχει ήδη στον διακομιστή, θα λάβουμε ένα μήνυμα σφάλματος. Χρησιμοποιώντας το ίδιο αντικείμενο όπως πριν, ας τρέξουμε ένα ερώτημα για να δούμε όλους τους πίνακες που είναι αποθηκευμένοι στη βάση δεδομένων: MySQLConnection SHOW DATABASES

δοκιμάστε: με τη σύνδεση (host = "localhost", user = input ("Username:"), password = getpass ("Password:"),) as connection: show_db_query = "Εμφάνιση βάσεων δεδομένων" με το connection.cursor () ως δρομέα: cursor.execute (show_db_query) for db in cursor: print (db) εκτός Error as e: print (e)

ΠΑΡΑΓΩΓΉ

Εισαγάγετε όνομα χρήστη: root

Εισάγετε τον κωδικό πρόσβασης: ········

('information_schema',)

('mysql',)

('online_movie_rating',)

('performance_schema',)

('sys',)

Ο παραπάνω κώδικας θα εκτυπώσει τα ονόματα όλων των βάσεων δεδομένων που βρίσκονται στον διακομιστή MySQL. Η εντολή στο παράδειγμά μας επίσης απορρίπτει βάσεις δεδομένων που δημιουργούνται αυτόματα από τον διακομιστή MySQL και παρέχουν πρόσβαση σε μεταδεδομένα βάσης δεδομένων και ρυθμίσεις διακομιστή. ΕΜΦΑΝΙΣΗ ΒΑΣΩΝ ΒΑΣΩΝ

Σύνδεση σε υπάρχουσα βάση δεδομένων

Έτσι, έχουμε δημιουργήσει μια βάση δεδομένων που ονομάζεται. Για να συνδεθούμε με αυτήν, απλώς συμπληρώνουμε την κλήση με μια παράμετρο: βάση δεδομένων online_movie_rating connect ()

δοκιμάστε: με σύνδεση (host = "localhost", user = input ("Username:"), password = getpass ("Password:"), database = "online_movie_rating",) ως σύνδεση: print (σύνδεση) εκτός από Error as e: εκτύπωση (ε)

Δημιουργία, τροποποίηση και απόθεση πινάκων

Σε αυτήν την ενότητα, συζητάμε πώς να χρησιμοποιήσετε την Python για την εκτέλεση ορισμένων βασικών ερωτημάτων: ',' και '.' ΔΗΜΙΟΥΡΓΙΑ ΤΡΑΠΕΖΙΟΥ DROP ALTER

Καθορισμός του σχήματος της βάσης δεδομένων

Ας ξεκινήσουμε δημιουργώντας ένα σχήμα βάσης δεδομένων για το σύστημα αξιολόγησης ταινιών. Πάρτε τη βάση δεδομένων που αποτελείται από τρεις πίνακες:

1. ταινίες- γενικές πληροφορίες για τις ταινίες:

  • Id

  • +

  • τίτλος

  • έτος κυκλοφορίας

  • είδος

  • συλλογή_σε_μι

2. κριτικοί- πληροφορίες για τα άτομα που δημοσίευσαν τις βαθμολογίες των ταινιών:

  1. id

  2. όνομα

  3. επίθετο

3. αξιολογήσεις- πληροφορίες σχετικά με τις βαθμολογίες των ταινιών από κριτές:

  1. movie_id (ξένο κλειδί)

  2. reviewer_id (ξένο κλειδί)

  3. εκτίμηση

Αυτοί οι τρεις πίνακες είναι επαρκείς για τους σκοπούς αυτού του οδηγού.

Διάγραμμα συστήματος βαθμολογίας φιλμΔιάγραμμα συστήματος βαθμολογίας φιλμ

Οι πίνακες στη βάση δεδομένων σχετίζονται μεταξύ τους: οι ταινίες και οι αναθεωρητές πρέπει να έχουν σχέση μεταξύ πολλών: μία ταινία μπορεί να προβληθεί από πολλούς κριτές και ένας αναθεωρητής μπορεί να αναθεωρήσει πολλές ταινίες. Οι βαθμολογίες του πίνακα συνδέουν τον πίνακα ταινιών με τον πίνακα του κριτή.

Δημιουργία πινάκων χρησιμοποιώντας τη δήλωση CREATE TABLE

Για να δημιουργήσουμε έναν νέο πίνακα στο MySQL, πρέπει να χρησιμοποιήσουμε τον τελεστή. Το ακόλουθο ερώτημα MySQL θα δημιουργήσει τον πίνακα της βάσης δεδομένων μας: ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑΣ ταινίες online_movie_rating

ΔΗΜΙΟΥΡΓΙΑ ΤΑΙΝΙΩΝ (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR (100), release_year YEAR (4), είδος VARCHAR (100), collection_in_mil INT);

Εάν έχετε συναντήσει SQL στο παρελθόν, θα καταλάβετε την έννοια του παραπάνω ερωτήματος. Η διάλεκτος MySQL έχει ορισμένα χαρακτηριστικά. Για παράδειγμα, η MySQL προσφέρει ένα ευρύ φάσμα τύπων δεδομένων, συμπεριλαμβανομένων κ.ο.κ. Επιπλέον, η MySQL χρησιμοποιεί τη λέξη -κλειδί όταν η τιμή της στήλης πρέπει να αυξάνεται αυτόματα όταν εισάγονται νέες εγγραφές. ΕΤΟΣ ΣΕ ΜΕΓΑΛΗ ΑΥΤΟΜΑΤΟΠΟΙΗΣΗ

Για να δημιουργήσετε έναν πίνακα, πρέπει να περάσετε το καθορισμένο ερώτημα στο cursor.execute ()

create_movies_table_query = "" "ΔΗΜΙΟΥΡΓΙΑ ταινιών (id INT AUTO_INCREMENT PRIMARY KEY, τίτλος VARCHAR (100), release_year YEAR (4), είδος VARCHAR (100), collection_in_mil INT)" "" with connection.cursor () as cursor: cursor: εκτέλεση (create_movies_table_query) connection.commit ()

Δώστε προσοχή στον χειριστή. Από προεπιλογή, ο σύνδεσμος MySQL δεν πραγματοποιεί αυτόματες συναλλαγές. Στο MySQL, οι τροποποιήσεις που αναφέρονται σε μια συναλλαγή συμβαίνουν μόνο όταν χρησιμοποιούμε την εντολή στο τέλος. Για να κάνετε αλλαγές σε έναν πίνακα, καλέστε πάντα αυτήν τη μέθοδο μετά από κάθε συναλλαγή. connection.commit () COMMIT

Ας επαναλάβουμε τη διαδικασία για τον πίνακα: κριτές

create_reviewers_table_query = "" "

ΔΗΜΙΟΥΡΓΗΣΗ ΠΙΝΑΚΑΣ κριτών (id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR (100), last_name VARCHAR (100)) "" "with connection.cursor () as cursor: cursor.execute (create_reviewers_table_query) connection.commit () Τέλος, ας δημιουργήσουμε ένα βαθμολογίες πίνακα: create_ratings_table_query = "" "ΔΗΜΙΟΥΡΓΗΣΤΕ αξιολογήσεις ΠΙΝΑΚΑ (movie_id INT, reviewer_id INT, rating DECIMAL (2,1), ΞΕΝΟ Κλειδί (movie_id) ΑΝΑΦΟΡΕΣ ταινίες (id), ΞΕΝΟ ΚΛΕΙΔΙ (reviewer_id) ΑΝΑΦΟΡΕΣ (id), PRIMARY KENER (movie_id, reviewer_id)) "" "with connection.cursor () as cursor: cursor.execute (create_ratings_table_query) connection.commit ()

Η εφαρμογή ξένων βασικών σχέσεων στο MySQL είναι ελαφρώς διαφορετική και έχει περιορισμούς σε σύγκριση με την τυπική SQL. Στο MySQL, τόσο ο γονέας όσο και το παιδί ενός ξένου κλειδιού πρέπει να χρησιμοποιούν την ίδια μηχανή αποθήκευσης - το υποκείμενο λογισμικό που χρησιμοποιεί το σύστημα διαχείρισης βάσεων δεδομένων για την εκτέλεση λειτουργιών SQL. Η MySQL προσφέρει δύο είδη τέτοιων μηχανισμών:

  1. Οι μηχανές αποθήκευσης συναλλαγών δεν είναι ασφαλείς για συναλλαγές και σας επιτρέπουν να επαναφέρετε τις συναλλαγές χρησιμοποιώντας απλές εντολές όπως π.χ. Πολλοί δημοφιλείς κινητήρες MySQL ανήκουν σε αυτήν την κατηγορία, συμπεριλαμβανομένων των InnoDB και NDB. επιστροφή

  2. Οι μη συναλλακτικές μηχανές αποθήκευσης βασίζονται σε μη αυτόματο κώδικα για να αναιρέσουν τις δηλώσεις που έχουν δεσμευτεί στη βάση δεδομένων. Αυτά είναι, για παράδειγμα, MyISAM και MEMORY.

Το InnoDB είναι η πιο δημοφιλής προεπιλεγμένη μηχανή αποθήκευσης. Με την επιβολή ξένων βασικών περιορισμών, βοηθά στη διατήρηση της ακεραιότητας των δεδομένων. Αυτό σημαίνει ότι οποιαδήποτε λειτουργία CRUD ξένου κλειδιού ελέγχεται εκ των προτέρων για να διασφαλιστεί ότι δεν οδηγεί σε ασυνέπεια μεταξύ διαφορετικών πινάκων.

Σημειώστε ότι ο πίνακας χρησιμοποιεί στήλες και δύο ξένα κλειδιά, που λειτουργούν μαζί ως κύριο κλειδί. Αυτή η δυνατότητα διασφαλίζει ότι ένας κριτής δεν μπορεί να βαθμολογήσει την ίδια ταινία δύο φορές. αξιολογήσεις movie_id reviewer_id

Ο ίδιος δρομέας μπορεί να χρησιμοποιηθεί για πολλαπλά χτυπήματα. Σε αυτήν την περίπτωση, όλες οι κλήσεις θα γίνουν μία ατομική συναλλαγή. Για παράδειγμα, μπορείτε να εκτελέσετε όλες τις δηλώσεις με έναν δρομέα και, στη συνέχεια, να πραγματοποιήσετε τη συναλλαγή ταυτόχρονα:

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ με το connection.cursor () ως δρομέα: cursor.execute (create_movies_table_query) cursor.execute (create_reviewers_table_query) cursor.execute (create_ratings_table_query) connection.commit ()

Εμφάνιση σχήματος πίνακα χρησιμοποιώντας τη δήλωση ΠΕΡΙΓΡΑΦΗ

Δημιουργήσαμε τρεις πίνακες και μπορούμε να δούμε το σχήμα χρησιμοποιώντας τον τελεστή. ΠΕΡΙΓΡΑΦΩ

Υποθέτοντας ότι έχετε ήδη ένα αντικείμενο σε μια μεταβλητή, μπορούμε να εκτυπώσουμε τα αποτελέσματα που λαμβάνονται. Αυτή η μέθοδος ανακτά όλες τις γραμμές από την τελευταία εκτελούμενη πρόταση: MySQLConnection connection cursor.fetchall ()

show_table_query = "ΠΕΡΙΓΡΑΦΗ ταινιών" με το connection.cursor () ως δρομέα: cursor.execute (show_table_query) # Λήψη σειρών από το αποτέλεσμα του τελευταίου ερωτήματος που εκτελέστηκε = cursor.fetchall () για τη σειρά στο αποτέλεσμα: εκτύπωση (σειρά)

ΠΑΡΑΓΩΓΉ

('id', 'int (11)', 'NO', 'PRI', None, 'auto_increment')

(«τίτλος», «varchar (100)», «ΝΑΙ», », Κανένα,»)

('έτος_απελευθέρωσης', 'έτος (4)', 'ΝΑΙ', ”, Καμία,”)

("είδος", "varchar (100)", "ΝΑΙ", "Καμία,")

('collection_in_mil', 'int (11)', 'YES', ”, None,”)

Μετά την εκτέλεση του παραπάνω κώδικα, θα πρέπει να λάβουμε έναν πίνακα που περιέχει πληροφορίες σχετικά με τις στήλες του πίνακα. Για κάθε στήλη, εμφανίζονται πληροφορίες σχετικά με τον τύπο δεδομένων, αν η στήλη είναι κύριο κλειδί κ.ο.κ. κινηματογράφος

Αλλαγή του σχήματος ενός πίνακα χρησιμοποιώντας την πρόταση ALTER

Η στήλη ονόματος στον πίνακα περιέχει το ταμείο της ταινίας σε εκατομμύρια δολάρια. Μπορούμε να γράψουμε την ακόλουθη δήλωση MySQL για να αλλάξουμε τον τύπο δεδομένων ενός χαρακτηριστικού από σε collection_in_mil ταινίες collection_in_mil INT DECIMAL

ΤΡΑΠΕΖΕΣ ΑΛΛΑΓΗΣ ΠΙΝΑΚΑΣ ΤΡΟΠΟΠΟΙΗΣΗ ΣΤΗΛΗΣ collection_in_mil DECIMAL (4,1);

Ο ΔΕΚΤΙΚΟΣ (4,1) υποδεικνύει έναν δεκαδικό αριθμό, ο οποίος μπορεί να έχει το πολύ τέσσερα ψηφία, εκ των οποίων το ένα αντιστοιχεί στη δέκατη απαλλαγή, για παράδειγμα, και ούτω καθεξής. ρε. 120.1 3.4 38.0

alter_table_query = "" "ΑΛΛΑΓΕΣ ΠΙΝΑΚΑΣ ΤΡΟΠΟΠΟΙΗΣΗ ΣΤΗΛΗΣ collection_in_mil DECIMAL (4,1)" "show_table_query =" ΠΕΡΙΓΡΑΦΗ ταινιών "με το connection.cursor () ως δρομέα: cursor.execute (alter_table_query) cursor.execute_execute από το αποτέλεσμα του τελευταίου ερωτήματος που εκτελέστηκε = cursor.fetchall () print ("Σχήμα πίνακα ταινιών μετά την τροποποίηση:") για τη σειρά στο αποτέλεσμα: εκτύπωση (σειρά) Το σχήμα πίνακα ταινιών μετά από αλλαγές: ('id', 'int (11) ',' ΟΧΙ ',' PRI ', Καμία,' auto_increment ') (' τίτλος ',' varchar (100) ',' ΝΑΙ ',' ', Καμία,' ') (' έτος έκδοσης ',' έτος (4) ',' ΝΑΙ ',' ', Κανένα,' ') (' είδος ',' varchar (100) ',' ΝΑΙ ',' ', Κανένα,' ') (' συλλογή_σε_μιλ ',' δεκαδικό (4,1) ',' ΝΑΙ ',' ', Κανένα,' ')

Όπως φαίνεται στην έξοδο, το χαρακτηριστικό άλλαξε επίσης τον τύπο του. Σημειώστε ότι στον παραπάνω κώδικα, καλούμε δύο φορές, αλλά λαμβάνει μόνο γραμμές από το πιο πρόσφατα εκτελούμενο ερώτημα, το οποίο είναι. collection_in_mil DECIMAL (4,1) cursor.execute () cursor.fetchall () show_table_query

Πτώση πινάκων χρησιμοποιώντας τη δήλωση DROP

Για να διαγράψετε πίνακες, χρησιμοποιήστε τον τελεστή. Η πτώση ενός τραπεζιού είναι μια μη αναστρέψιμη διαδικασία. Εάν εκτελέσετε τον παρακάτω κώδικα, θα πρέπει να επικαλεστείτε ξανά το ερώτημα στον πίνακα: DROP TABLE CREATE TABLE ratings

drop_table_query = "DROP TABLE ratings" with connection.cursor () as cursor: cursor.execute (drop_table_query)

Εισαγωγή εγγραφών σε πίνακες

Ας γεμίσουμε τους πίνακες με δεδομένα. Σε αυτήν την ενότητα, θα εξετάσουμε δύο τρόπους εισαγωγής εγγραφών χρησιμοποιώντας το MySQL Connector σε κώδικα Python.

Η πρώτη μέθοδος λειτουργεί καλά όταν ο αριθμός των εγγραφών είναι μικρός. Το δεύτερο ταιριάζει καλύτερα σε σενάρια πραγματικής ζωής. .execute () .executemany ()

Εισαγωγή εγγραφών με .execute ()

Η πρώτη προσέγγιση χρησιμοποιεί την ίδια μέθοδο που χρησιμοποιούσαμε μέχρι τώρα. Γράφουμε ένα αίτημα και το στέλνουμε στον cursor.execute() INSERT IGNORE INTO cursor.execute()

insert_movies_query = """ INSERT IGNORE INTO movies (τίτλος, έτος κυκλοφορίας, είδος, συλλογή_σε_mil) VALUES ("Forrest Gump", 1994, "Drama", 330.2), ("3 Idiots", 2009, "Drama", 2.4) "Eternal Sunshine of the Spotless Mind", 2004, "Drama", 34.5), ("Good Will Hunting", 1997, "Drama", 138.1), ("Skyfall", 2012, "Action", 304.6), (" Gladiator», 2000, «Action», 188.7), («Black», 2005, «Drama», 3.0), («Titanic», 1997, «Romance», 659.2), («The Shawshank Redemption», 1994, « Δράμα»,28.4), («Udaan», 2010, «Drama», 1.5), («Home Alone», 1990, «Comedy», 286.9), («Casablanca», 1942, «Romance», 1.0), ( "Avengers: Endgame", 2019, "Action", 858.8), ("Night of the Living Dead", 1968, "Horror", 2.5), ("The Godfather", 1972, "Crime", 135.6), (" Haider", 2014, "Action", 4.2), ("Inception", 2010, "Adventure", 293.7), ("Evil", 2003, "Horror", 1.3), ("Toy Story 4", 2019, " Animation», 434.9), ("Air Force One", 1997, "Drama", 138.1), ("The Dark Knight", 2008, "Action",535.4), ("Bhaag Milkha Bhaag", 2013, "Sport" , 4.1. 1994), ("The Lion King", 423.6, "Animation", 1994), ("Pulp Fiction", 108.8, "Crime", 2013), ("Kai Po Che", 6.0, "Sport", 2015) ("Beasts of No Nation", 1.4, "War", 2018), ("Andadhun", 2.9, "Thriller", 1991), ("The Silence of the Lambs", 68.2, "Crime", 2016), ( "Deadpool", 363.6, "Action", 2015), ("Drishyam", 3.0, "Mystery", XNUMX) """ με τη σύνδεση.cursor() ως δρομέα: cursor.execute(insert_movies_query) connection.commit()

Ο πίνακας είναι τώρα γεμάτος με τριάντα εγγραφές. Στο τέλος, ο κώδικας καλεί. Θυμηθείτε να καλέσετε αφού κάνετε οποιεσδήποτε αλλαγές στον πίνακα. σύνδεση ταινιών.commit () .commit ()

Εισαγωγή εγγραφών με .executemany ()

Η προηγούμενη προσέγγιση είναι κατάλληλη για τη μικρότερη εγγραφή που μπορεί να εισαχθεί εύκολα μέσω κώδικα. Αλλά συνήθως, τα δεδομένα αποθηκεύονται σε ένα αρχείο ή δημιουργούνται από άλλο σενάριο. Εδώ είναι που είναι χρήσιμο. Η μέθοδος λαμβάνει δύο παραμέτρους: .executemany ()

  1. Ένα ερώτημα που περιέχει σημεία κράτησης για τις εγγραφές που πρόκειται να εισαχθούν.

  2. Λίστα εγγραφών για εισαγωγή.

Ας πάρουμε μια προσέγγιση για να συμπληρώσουμε τον πίνακα: κριτές

insert_reviewers_query = """ INSERT IGNORE INTO reviewers (first_name, last_name) VALUES ( %s, %s ) """ reviewers_records = [ ("Chaitanya", "Baweja"), ("Mary", "Cooper"), (" John", "Wayne"), ("Thomas", "Stoneman"), ("Penny", "Hofstadter"), ("Mitchell", "Marsh"), ("Wyatt", "Skaggs"), (" Andre", "Veiga"), ("Sheldon", "Cooper"), ("Kimbra", "Masters"), ("Kat", "Dennings"), ("Bruce", "Wayne"), (" Domingo", "Cortes"), ("Rajesh", "Koothrappali"), ("Ben", "Glocker"), ("Mahinder", "Dhoni"), ("Akbar", "Khan"), (" Howard", "Wolowitz"), ("Pinkie", "Petit"), ("Gurkaran", "Singh"), ("Amy", "Farah Fowler"), ("Marlon", "Crafford"), ] με τη σύνδεση.cursor() ως δρομέα: cursor.executemany(insert_reviewers_query, reviewers_records) connection.commit()

Αυτός ο κώδικας λαμβάνει θέσεις για δύο συμβολοσειρές που έχουν εισαχθεί. Τα σύμβολα τοποθέτησης λειτουργούν ως προσδιοριστές μορφής και βοηθούν στην κράτηση χώρου για μια μεταβλητή μέσα σε μια συμβολοσειρά. %s insert_reviewers_query

Ας συμπληρώσουμε τον πίνακα με τον ίδιο τρόπο: βαθμολογίες

insert_ratings_query = """ INSERT IGNORE INTO βαθμολογίες (rating, movie_id, reviewer_id) VALUES ( %s, %s, %s) """ ratings_records = [ (6.4, 17, 5), (5.6, 19, 1), ( 6.3, 22, 14), (5.1, 21, 17), (5.0, 5, 5), (6.5, 21, 5), (8.5, 30, 13), (9.7, 6, 4), (8.5, 24, 12), (9.9, 14, 9), (8.7, 26, 14), (9.9, 6, 10), (5.1, 30, 6), (5.4, 18, 16), (6.2, 6, 20), (7.3, 21, 19), (8.1, 17, 18), (5.0, 7, 2), (9.8, 23, 3), (8.0, 22, 9), (8.5, 11, 13) , (5.0, 5, 11), (5.7, 8, 2), (7.6, 25, 19), (5.2, 18, 15), (9.7, 13, 3), (5.8, 18, 8), ( 5.8, 30, 15), (8.4, 21, 18), (6.2, 23, 16), (7.0, 10, 18), (9.5, 30, 20), (8.9, 3, 19), (6.4, 12, 2), (7.8, 12, 22), (9.9, 15, 13), (7.5, 20, 17), (9.0, 25, 6), (8.5, 23, 2), (5.3, 30, 17), (6.4, 5, 10), (8.1, 5, 21), (5.7, 22, 1), (6.3, 28, 4), (9.8, 13, 1) ] με σύνδεση.cursor() ως δρομέας: cursor.executemany(insert_ratings_query, ratings_records) connection.commit()

Και οι τρεις πίνακες είναι τώρα γεμάτοι με δεδομένα. Το επόμενο βήμα είναι να καταλάβουμε πώς να αλληλεπιδράσουμε με αυτήν τη βάση δεδομένων.

Ανάγνωση εγγραφών από τη βάση δεδομένων

Μέχρι στιγμής, έχουμε δημιουργήσει μόνο στοιχεία βάσης δεδομένων. It'sρθε η ώρα να εκτελέσουμε μερικά ερωτήματα και να βρούμε τις ιδιότητες που μας ενδιαφέρουν. Σε αυτήν την ενότητα, θα μάθουμε πώς να διαβάζουμε εγγραφές από πίνακες βάσεων δεδομένων χρησιμοποιώντας τον τελεστή. ΕΠΙΛΕΓΩ

Ανάγνωση εγγραφών με μια δήλωση SELECT

Για να λάβετε αρχεία, πρέπει να στείλετε στο αίτημα και να επιστρέψετε το αποτέλεσμα χρησιμοποιώντας: cursor.execute () SELECT cursor.fetchall ()

select_movies_query = "SELECT * FROM movies LIMIT 5" with connection.cursor () as cursor: cursor.execute (select_movies_query) result = cursor.fetchall () για τη σειρά στο αποτέλεσμα: εκτύπωση (σειρά)

ΠΑΡΑΓΩΓΉ

(1, «Forrest Gump», 1994, «Δράμα», Δεκαδικό («330.2»))

(2, '3 Ηλίθιοι', 2009, 'Δράμα', Δεκαδικό ('2.4'))

(3, 'Eternal Sunshine of the Spotless Mind', 2004, 'Drama', Decimal ('34.5 .XNUMX '))

(4, 'Good Will Hunting', 1997, 'Drama', Δεκαδικό ('138.1'))

(5, 'Skyfall', 2012, 'Action', Δεκαδικό ('304.6'))

Η μεταβλητή περιέχει τις εγγραφές που επιστρέφονται. Είναι μια λίστα με πλειάδες που αντιπροσωπεύουν μεμονωμένες εγγραφές σε έναν πίνακα. αποτέλεσμα .fetchall ()

Στο παραπάνω ερώτημα, χρησιμοποιούμε μια λέξη -κλειδί για να περιορίσουμε τον αριθμό των γραμμών που λαμβάνονται από τον τελεστή. Οι προγραμματιστές χρησιμοποιούνται συχνά για να σελιδοποιήσουν την έξοδο κατά την επεξεργασία μεγάλου όγκου δεδομένων. LIMIT SELECT LIMIT

Στο MySQL, δύο μη αρνητικά αριθμητικά ορίσματα μπορούν να περάσουν σε έναν τελεστή: LIMIT

ΕΠΙΛΟΓΗ * ΑΠΟ ταινίες LIMIT 2,5;

Όταν χρησιμοποιείτε δύο αριθμητικά ορίσματα, το πρώτο καθορίζει μια μετατόπιση, η οποία σε αυτό το παράδειγμα είναι 2, και η δεύτερη περιορίζει τον αριθμό των γραμμών που επιστρέφονται σε 5. Δηλαδή, το ερώτημα από το παράδειγμα θα επιστρέψει τις γραμμές 3 έως 7.

select_movies_query = "SELECT title, release_year FROM movies LIMIT 2, 5" with connection.cursor () as cursor: cursor.execute (select_movies_query) for row in cursor.fetchall (): print (row)

ΠΑΡΑΓΩΓΉ

(«Eternal Sunshine of the Spotless Mind», 2004)

(«Good Will Hunting», 1997)

(«Skyfall», 2012)

(«Μονομάχος», 2000)

("Μαύρο", 2005)

Φιλτράρισμα αποτελεσμάτων με WHERE

Οι καταχωρήσεις πίνακα μπορούν επίσης να φιλτραριστούν χρησιμοποιώντας. Για να αποκτήσετε όλες τις ταινίες με εισιτήρια άνω των 300 εκατομμυρίων δολαρίων, εκτελέστε το ακόλουθο ερώτημα: ΠΟΥ

select_movies_query = "" "ΕΠΙΛΟΓΗ τίτλου, συλλογής_σε_μιλίας ΑΠΟ ταινίες WHERE collection_in_mil> 300 ORDER BY collection_in_mil DESC" "with connection.cursor () as cursor: cursor.execute (select_movies_query) for movie in cursor.fetchall () («Avengers: Endgame», Δεκαδικό («858.8»)) («Τιτανικός», Δεκαδικός («659.2»)) («Ο σκοτεινός ιππότης», δεκαδικός («535.4»)) («Toy Story 4», Δεκαδικός (« 434.9 ')) ("Ο βασιλιάς των λιονταριών", δεκαδικός ("423.6")) ("Deadpool", δεκαδικός ("363.6")) ("Forrest Gump", δεκαδικός ("330.2")) ("Skyfall", δεκαδικός ( '304.6')))

Η φράση στο ερώτημα σας επιτρέπει να ταξινομήσετε τα τέλη από τα υψηλότερα στα χαμηλότερα. ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ

Η MySQL παρέχει πολλές λειτουργίες μορφοποίησης συμβολοσειρών, όπως για τη σύνδεση των συμβολοσειρών. Για παράδειγμα, οι τίτλοι ταινιών εμφανίζονται συνήθως μαζί με το έτος κυκλοφορίας για να αποφευχθεί η σύγχυση. Ας πάρουμε τα ονόματα των πέντε πιο κερδοφόρων ταινιών μαζί με τις ημερομηνίες κυκλοφορίας τους: CONCAT

select_movies_query = "" "SELECT CONCAT (title," (", release_year,") "), collection_in_mil FROM movies ORDER BY collection_in_mil DESC LIMIT 5" "with connection.cursor () as cursor: cursor.execute (select_movies_query) movie στο cursor.fetchall (): εκτύπωση (ταινία)

ΠΑΡΑΓΩΓΉ

('Avengers: Endgame (2019)', Δεκαδικό ('858.8'))

(«Τιτανικός (1997)», δεκαδικός («659.2»)

("The Dark Knight (2008)", Δεκαδικό ("535.4"))

(«Toy Story 4 (2019)», Δεκαδικό («434.9»))

("The Lion King (1994)", Δεκαδικό ("423.6"))

Εάν δεν θέλετε να χρησιμοποιήσετε και δεν χρειάζεται να λάβετε όλες τις εγγραφές, μπορείτε να χρησιμοποιήσετε τις μεθόδους δρομέα και: LIMIT .fetchone () .fetchmany ()

  • .fetchone () Ανακτά την επόμενη σειρά του αποτελέσματος ως πλειάδα ή εάν δεν υπάρχουν περισσότερες διαθέσιμες σειρές. Κανένας

  • .fetchmany () Ανακτά μια λίστα με το επόμενο σύνολο γραμμών ως πλειάδα. Για να γίνει αυτό, περνάει ένα όρισμα, το οποίο από προεπιλογή είναι 1. Εάν δεν υπάρχουν περισσότερες διαθέσιμες γραμμές, η μέθοδος επιστρέφει μια κενή λίστα.

Και πάλι, εξαγάγετε τους τίτλους των πέντε ταινιών με τις υψηλότερες εισπράξεις ανά έτος, αλλά αυτή τη φορά χρησιμοποιώντας: .fetchmany ()

select_movies_query = "" "SELECT CONCAT (title," (", release_year,") "), collection_in_mil FROM movies ORDER BY collection_in_mil DESC" "with" connection.cursor () as cursor: cursor.execute (select_movies_query) for movie in cursor .fetchmany (μέγεθος = 5): εκτύπωση (ταινία) cursor.fetchall ()

ΠΑΡΑΓΩΓΉ

('Avengers: Endgame (2019)', Δεκαδικό ('858.8'))

(«Τιτανικός (1997)», δεκαδικός («659.2»)

("The Dark Knight (2008)", Δεκαδικό ("535.4"))

(«Toy Story 4 (2019)», Δεκαδικό («434.9»))

("The Lion King (1994)", Δεκαδικό ("423.6"))

Μπορεί να έχετε παρατηρήσει μια επιπλέον πρόκληση. Το κάνουμε αυτό για να καθαρίσουμε τυχόν υπόλοιπα μη αναγνωσμένα αποτελέσματα. cursor.fetchall () .fetchmany ()

Πριν από την εκτέλεση οποιωνδήποτε άλλων δηλώσεων για την ίδια σύνδεση, πρέπει να διαγράψετε τυχόν μη αναγνωσμένα αποτελέσματα. Διαφορετικά, γίνεται εξαίρεση. Εσωτερικό σφάλμα

ΕΓΓΡΑΦΕΙΤΕ πολλαπλούς πίνακες

Για να μάθετε τα ονόματα των πέντε ταινιών με την υψηλότερη βαθμολογία, εκτελέστε το ακόλουθο ερώτημα:

select_movies_query = "" "ΕΠΙΛΟΓΗ τίτλου, AVG (βαθμολογία) ως μέση βαθμολογία ΑΠΟ βαθμολογίες ΕΣΩΤΕΡΟΣ ΣΥΜΜΕΤΟΧΗ ταινιών ON movies.id = ratings.movie_id GROUP BY movie_id ΠΑΡΑΓΓΕΛΙΑ ΜΕ μέσος όρος βαθμολόγησης ΠΕΡΙΟΡΙΣΜΟΣ 5" "με το connection.cursor () ως δρομέας: δρομέας. εκτέλεση (select_movies_query) για ταινία στο cursor.fetchall (): εκτύπωση (ταινία)

ΠΑΡΑΓΩΓΉ

(«Νύχτα των ζωντανών νεκρών», δεκαδικό («9.90000»)

(«Ο Νονός», Δεκαδικός («9.90000»))

('Avengers: Endgame', Δεκαδικό ('9.75000'))

('Eternal Sunshine of the Spotless Mind', Δεκαδικό ('8.90000'))

(«Beasts of No Nation», Δεκαδικό («8.70000»)

Μπορείτε να βρείτε το όνομα του κριτικού με τις περισσότερες βαθμολογίες όπως αυτό:

select_movies_query = "" "SELECT CONCAT (first_name," ", last_name), COUNT (*) as num FROM reviewers INNER JOIN ratings ON reviewers.id = ratings.reviewer_id GROUP BY reviewer_id ORDER BY num DESC LIMIT 1" "με σύνδεση. δρομέας () ως δρομέας: cursor.execute (select_movies_query) για ταινία στο cursor.fetchall (): εκτύπωση (ταινία) («Mary Cooper», 4)

Όπως μπορείτε να δείτε, οι περισσότερες κριτικές γράφτηκαν από τη Mary Cooper.

Η διαδικασία εκτέλεσης ενός ερωτήματος παραμένει πάντα η ίδια: περνάμε το ερώτημα για να λάβουμε τα αποτελέσματα χρησιμοποιώντας. cursor.execute () .fetchall ()

Ενημέρωση και διαγραφή εγγραφών από τη βάση δεδομένων

Σε αυτήν την ενότητα, θα ενημερώσουμε και θα αφαιρέσουμε μερικές από τις καταχωρήσεις. Θα επιλέξουμε τις απαιτούμενες γραμμές χρησιμοποιώντας μια λέξη -κλειδί. ΟΠΟΥ

Εντολή ΕΝΗΜΕΡΩΣΗ

Φανταστείτε μια κριτική Amy Farah Fowler είναι παντρεμένη με τον Sheldon Cooper. Άλλαξε το επώνυμό της σε Cooper και πρέπει να ενημερώσουμε τη βάση δεδομένων. Για να ενημερώσετε τις εγγραφές στο MySQL, χρησιμοποιήστε τον τελεστή: UPDATE

update_query = "" "UPDATE reviewers SET last_name =" Cooper "WHERE first_name =" Amy "" "" with connection.cursor () as cursor: cursor.execute (update_query) connection.commit ()

Ο κώδικας διαβιβάζει το αίτημα ενημέρωσης και πραγματοποιεί τις απαραίτητες αλλαγές στον πίνακα. cursor.execute () .commit () κριτές

Ας υποθέσουμε ότι θέλουμε να επιτρέψουμε στους κριτές να αλλάξουν βαθμούς. Το πρόγραμμα πρέπει να γνωρίζει και το νέο. Παράδειγμα SQL: βαθμολογία movie_id reviewer_id

ΕΝΗΜΕΡΩΣΗ βαθμολογιών SET βαθμολογία = 5.0 WHERE movie_id = 18 ΚΑΙ reviewer_id = 15; SELECT * FROM ratings WHERE movie_id = 18 AND reviewer_id = 15; Τα καθορισμένα ερωτήματα ενημερώνουν πρώτα την αξιολόγηση και στη συνέχεια εξάγουν την ενημερωμένη. Ας γράψουμε ένα σενάριο Python που θα μας επιτρέψει να προσαρμόσουμε τους βαθμούς: ) new_rating = input ("Enter new rating:") update_query = "" "UPDATE ratings SET rating ="%s "WHERE movie_id ="%s "AND reviewer_id ="%s "; SELECT * FROM ratings WHERE movie_id ="% s "AND reviewer_id =" % s "" "" % (new_rating, movie_id, reviewer_id, movie_id, reviewer_id,) try: with connect (host = "localhost", user = input ("Enter username:"), password = getpass ("Εισαγάγετε κωδικό πρόσβασης:"), βάση δεδομένων = "online_movie_rating",) ως σύνδεση: με το connection.cursor () ως δρομέας: για αποτέλεσμα στο cursor.execute (update_query, multi = True): if result.with_rows: print (result fetchall ()) connection.commit () εκτός από Σφάλμα ως e: print (e)

ΠΑΡΑΓΩΓΉ

Εισαγάγετε το αναγνωριστικό ταινίας: 18

Εισαγάγετε αναγνωριστικό κριτικού: 15

Εισαγάγετε νέα βαθμολογία: 5

Εισαγάγετε όνομα χρήστη: root

Εισάγετε τον κωδικό πρόσβασης: ········

[(18, 15, Δεκαδικό ('5.0'))]

Για να περάσουμε πολλά αιτήματα στον ίδιο δρομέα, εκχωρούμε μια τιμή στο όρισμα. Σε αυτήν την περίπτωση, επιστρέφει έναν επαναληπτή. Κάθε στοιχείο στον επαναληπτή αντιστοιχεί σε ένα αντικείμενο δρομέα που εκτελεί την εντολή που έχει περάσει στο αίτημα. Ο παραπάνω κώδικας ξεκινά έναν βρόχο σε αυτόν τον επαναληπτή, καλώντας για κάθε αντικείμενο δρομέα. multi True cursor.execute () για .fetchall ()

Εάν δεν έχει επιτευχθεί σύνολο αποτελεσμάτων για τη λειτουργία, τότε γίνεται εξαίρεση. Για να αποφύγουμε αυτό το σφάλμα, στον παραπάνω κώδικα, χρησιμοποιούμε μια ιδιότητα που υποδεικνύει εάν η τελευταία εκτέλεση της λειτουργίας δημιούργησε σειρές. .fetchall () δρομέας.με_σειρές

Ενώ αυτός ο κώδικας κάνει τη δουλειά του, η οδηγία, ως έχει, είναι ένας δελεαστικός στόχος για τους χάκερ. Είναι ευάλωτο σε μια επίθεση με ένεση SQL που θα μπορούσε να επιτρέψει στους επιτιθέμενους να καταστρέψουν ή να κάνουν κακή χρήση της βάσης δεδομένων. ΟΠΟΥ

Για παράδειγμα, εάν ο χρήστης υποβάλει, και ως είσοδο, τότε το αποτέλεσμα θα μοιάζει με αυτό: movie_id = 18 reviewer_id = 15 αξιολογήσεις = 5.0

$ python modify_ratings.py

Εισαγάγετε το αναγνωριστικό ταινίας: 18

Εισαγάγετε αναγνωριστικό κριτικού: 15

Εισαγάγετε νέα βαθμολογία: 5.0

Εισάγετε όνομα χρήστη:

Εισάγετε τον κωδικό πρόσβασης:

[(18, 15, Δεκαδικό ('5.0'))]

Το σκορ για και άλλαξε επίσης. Αν ήσασταν χάκερ, θα μπορούσατε να στείλετε μια κρυφή εντολή στην είσοδο: movie_id = 18 reviewer_id = 15 5.0

$ python modify_ratings.py

Εισαγάγετε το αναγνωριστικό ταινίας: 18

Εισαγάγετε αναγνωριστικό κριτικού: 15 ″; UPDATE reviewers SET last_name = "A

Εισαγάγετε νέα βαθμολογία: 5.0

Εισάγετε όνομα χρήστη:

Εισάγετε τον κωδικό πρόσβασης:

[(18, 15, Δεκαδικό ('5.0'))]

Και πάλι, η έξοδος δείχνει ότι η αναφερόμενη βαθμολογία έχει αλλάξει σε 5.0. Τι άλλαξε;

Ο χάκερ υποκρύπησε το αίτημα ενημέρωσης δεδομένων. Ένα αίτημα ενημέρωσης θα αλλάξει όλες τις εγγραφές στον πίνακα του κριτή: last_name "A"

>>> select_query = "" "

… ΕΠΙΛΟΓΗ first_name, last_name

… ΑΠΟ κριτές

… ”” ”

>>> με το connection.cursor () ως δρομέα:

… Cursor.execute (select_query)

… Για κριτικό στο cursor.fetchall ():

… Εκτύπωση (κριτής)

...

(«Chaitanya», «A»)

("Mary", "A")

("John", "A")

(«Thomas», «A»)

("Penny", "A")

(«Μίτσελ», «Α»)

("Wyatt", "A")

(«Αντρέ», «Α»)

(«Sheldon», «A»)

(«Kimbra», «A»)

("Kat", "A")

(«Μπρους», «Α»)

(«Ντομίνγκο», «Α»)

("Rajesh", "A")

("Ben", "A")

("Mahinder", "A")

("Akbar", "A")

("Howard", "A")

(«Pinkie», «A»)

("Gurkaran", "A")

("Amy", "A")

("Marlon", "A")

Ο παραπάνω κώδικας εμφανίζεται και για όλες τις εγγραφές στον πίνακα των κριτών. Μια επίθεση με ένεση SQL κατέστρεψε αυτόν τον πίνακα, αλλάζοντας όλες τις εγγραφές σε "A". first_name last_name last_name

Υπάρχει μια γρήγορη λύση για την πρόληψη τέτοιων επιθέσεων. Μην προσθέτετε τιμές ερωτήματος που παρέχονται από το χρήστη απευθείας στη συμβολοσειρά ερωτήματος. Καλύτερα να ενημερώσετε το σενάριο στέλνοντας τιμές αιτήματος ως ορίσματα στο .execute ()

modify_ratings.py from getpass import getpass from mysql.connector import connect, Error movie_id = input ("Enter movie id:") reviewer_id = input ("Enter reviewer id:") new_rating = input ("Enter new rating:") update_query = "" "UPDATE ratings SET rating = %s WHERE movie_id = %s AND reviewer_id = %s; SELECT * FROM ratings WHERE movie_id = %s AND reviewer_id = %s" "val_tuple = (new_rating, movie_id, reviewer_id, movie_id, reviewer_id ,) δοκιμάστε: με τη σύνδεση (host = "localhost", user = input ("Enter username:"), password = getpass ("Enter password:"), database = "online_movie_rating",) as connection: with connection.cursor ( ) ως δρομέας: για αποτέλεσμα cursor.execute (update_query, val_tuple, multi = True): if result.with_rows: print (result.fetchall ()) connection.commit () εκτός από Σφάλμα ως e: print (e)

Λάβετε υπόψη ότι τα σύμβολα κράτησης θέσης δεν περιλαμβάνονται πλέον σε εισαγωγικά συμβολοσειράς. επαληθεύει ότι οι τιμές στην πλειάδα που δίνονται ως όρισμα είναι του απαιτούμενου τύπου δεδομένων. Εάν ο χρήστης προσπαθήσει να εισαγάγει ορισμένους προβληματικούς χαρακτήρες, ο κώδικας θα δώσει μια εξαίρεση: %s cursor.execute ()

ΠΑΡΑΓΩΓΉ

$ python modify_ratings.py

Εισαγάγετε το αναγνωριστικό ταινίας: 18

Εισαγάγετε αναγνωριστικό κριτικού: 15 ″; UPDATE reviewers SET last_name = "A

Εισαγάγετε νέα βαθμολογία: 5.0

Εισάγετε όνομα χρήστη:

Εισάγετε τον κωδικό πρόσβασης:

1292 (22007): Κολοβωμένη εσφαλμένη ΔΙΠΛΗ τιμή: '15 ";

Αυτή η προσέγγιση θα πρέπει πάντα να χρησιμοποιείται όταν συμπεριλαμβάνετε την εισαγωγή χρήστη σε ένα αίτημα. Αφιερώστε χρόνο για να μάθετε για άλλους τρόπους πρόληψης των επιθέσεων ένεσης SQL.

Διαγραφή εγγραφών: η εντολή DELETE

Η διαδικασία διαγραφής εγγραφών μοιάζει πολύ με την ενημέρωσή τους. Δεδομένου ότι πρόκειται για μη αναστρέψιμη λειτουργία, σας συνιστούμε να εκτελέσετε πρώτα το ερώτημα με το ίδιο φίλτρο για να βεβαιωθείτε ότι διαγράφετε τις εγγραφές που θέλετε. Για παράδειγμα, για να καταργήσουμε όλες τις αξιολογήσεις ταινιών, τα δεδομένα, μπορούμε πρώτα να εκτελέσουμε το κατάλληλο ερώτημα: ΔΙΑΓΡΑΦΗ ΕΠΙΛΟΓΗΣ reviewer_id = 7 SELECT

select_movies_query = "" "SELECT reviewer_id, movie_id FROM rating WHERE review_id = 7" "" with connection.cursor () as cursor: cursor.execute (select_movies_query) for movie in cursor.fetchall (): print (movie)

ΠΑΡΑΓΩΓΉ

(2, 7)

(2, 8)

(2, 12)

(2, 23)

Το παραπάνω απόσπασμα κώδικα εμφανίζει ένα ζεύγος και για καταχωρίσεις στον πίνακα εκτιμήσεις, για το οποίο. Αφού βεβαιωθείτε ότι πρόκειται για τις εγγραφές που πρέπει να διαγραφούν, ας εκτελέσουμε το ερώτημα με το ίδιο φίλτρο: reviewer_id movie_id reviewer_id = 2 DELETE

delete_query = "DELETE FROM ratings WHERE reviewer_id = 2" with connection.cursor () as cursor: cursor.execute (delete_query) connection.commit ()

Άλλοι τρόποι σύνδεσης Python και MySQL

Σε αυτό το σεμινάριο, παρουσιάσαμε το MySQL Connector / Python, το οποίο είναι το επίσημα προτεινόμενο μέσο αλληλεπίδρασης με μια βάση δεδομένων MySQL από μια εφαρμογή Python. Ακολουθούν μερικές άλλες δημοφιλείς συνδέσεις:

  • Το mysqlclient είναι μια βιβλιοθήκη που ανταγωνίζεται τον επίσημο σύνδεσμο και συμπληρώνεται ενεργά με νέες λειτουργίες. Δεδομένου ότι ο πυρήνας της βιβλιοθήκης είναι γραμμένος σε C, έχει καλύτερη απόδοση από τον επίσημο καθαρό σύνδεσμο Python. Το μεγάλο μειονέκτημα είναι ότι η εγκατάσταση και εγκατάσταση του mysqlclient είναι αρκετά δύσκολη, ειδικά στα Windows.

  • Το MySQLdb είναι παλιό λογισμικό που χρησιμοποιείται ακόμη και σήμερα σε εμπορικές εφαρμογές. Συντάχθηκε σε C και γρηγορότερο MySQL Connector / Python, αλλά διατίθεται μόνο για Python 2.

Αυτά τα προγράμματα οδήγησης λειτουργούν ως διεπαφές μεταξύ του προγράμματος και της βάσης δεδομένων MySQL. Στην πραγματικότητα, απλώς στέλνετε τα ερωτήματά σας SQL μέσω αυτών. Ωστόσο, πολλοί προγραμματιστές προτιμούν να χρησιμοποιούν το αντικείμενο-προσανατολισμένο παράδειγμα για τη διαχείριση δεδομένων και όχι ερωτήματα SQL.

Η αντιστοίχιση αντιστοίχισης χαρτογράφησης (ORM) είναι μια διαδικασία που επιτρέπει όχι μόνο το ερώτημα, αλλά και τον χειρισμό δεδομένων από μια βάση δεδομένων απευθείας χρησιμοποιώνταςOOP. Η βιβλιοθήκη ORM περικλείει τον κώδικα που απαιτείται για τον χειρισμό δεδομένων, απαλλάσσοντας τους προγραμματιστές από την ανάγκη χρήσης ερωτημάτων SQL. Ακολουθούν οι πιο δημοφιλείς βιβλιοθήκες ORM για συνδυασμό Python και SQL:

  • Το SQLAlchemy είναι ένα ORM που απλοποιεί την επικοινωνία μεταξύ Python και άλλων βάσεων δεδομένων SQL. Μπορείτε να δημιουργήσετε διαφορετικούς κινητήρες για διαφορετικές βάσεις δεδομένων όπως MySQL, PostgreSQL, SQLite κ.λπ.

  • Το peewee είναι μια ελαφριά και γρήγορη βιβλιοθήκη ORM με απλή διαμόρφωση, η οποία είναι πολύ χρήσιμη όταν η αλληλεπίδρασή σας με τη βάση δεδομένων περιορίζεται στη λήψη μερικών εγγραφών. Εάν πρέπει να αντιγράψετε μεμονωμένες εγγραφές από μια βάση δεδομένων MySQL σε ένα αρχείο CSV, τότε το peewee είναι η καλύτερη επιλογή.

  • Το Django ORM είναι ένα από τα πιο ισχυρά μέρη του πλαισίου ιστού Django, επιτρέποντάς σας να αλληλεπιδράτε εύκολα με μια ποικιλία βάσεων δεδομένων SQLite, PostgreSQL και MySQL. Πολλές εφαρμογές που βασίζονται στο Django χρησιμοποιούν το Django ORM για μοντελοποίηση δεδομένων και βασικά ερωτήματα, ωστόσο, για πιο πολύπλοκες εργασίες, οι προγραμματιστές συνήθως χρησιμοποιούν το SQLAlchemy.

Συμπέρασμα

Σε αυτό το σεμινάριο, ρίξαμε μια ματιά στον τρόπο ενσωμάτωσης μιας βάσης δεδομένων MySQL στην εφαρμογή σας Python. Αναπτύξαμε επίσης ένα δοκιμαστικό δείγμα της βάσης δεδομένων MySQL και αλληλεπιδράσαμε με αυτό απευθείας από τον κώδικα Python. Η Python διαθέτει συνδέσμους για άλλα DBMS, όπως MongoDB και PostgreSQL. Θα χαρούμε να μάθουμε τι άλλο υλικό στην Python και τις βάσεις δεδομένων θα σας ενδιέφερε.

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του Συντάκτη.

Πλάτωνας. Επανεκτίμησε το Web3. Ενισχυμένη ευφυΐα δεδομένων.
Κάντε κλικ εδώ για πρόσβαση.

Πηγή: https://www.analyticsvidhya.com/blog/2021/08/python-and-mysql-a-practical-introduction-for-data-analysis/

spot_img

Τελευταία Νοημοσύνη

spot_img