इस लेख के एक भाग के रूप में प्रकाशित किया गया था डेटा साइंस ब्लॉगथॉन
परिचय
आइए पायथन कोड से MySQL सर्वर पर SQL क्वेरी बनाने का एक व्यावहारिक उदाहरण देखें: CREATE, SELECT, UPDATE, JOIN, आदि।
अधिकांश एप्लिकेशन किसी न किसी रूप में डेटा के साथ इंटरैक्ट करते हैं। इसलिए, प्रोग्रामिंग भाषाएं (पायथन कोई अपवाद नहीं है) डेटा स्रोतों को संग्रहीत करने और उन्हें एक्सेस करने के लिए उपकरण प्रदान करती हैं। MySQL सबसे शानदार और समृद्ध डेटाबेस मैनेजमेंट सिस्टम (DBMS) में से एक है। पिछले साल यह डेटाबेस रैंकिंग में Oracle के बाद दूसरे स्थान पर था।
इस ट्यूटोरियल में वर्णित तकनीकों का उपयोग करके, आप अपने पायथन एप्लिकेशन में एक MySQL डेटाबेस को प्रभावी ढंग से एकीकृत कर सकते हैं। इस ट्यूटोरियल में, हम मूवी रेटिंग सिस्टम के लिए एक छोटा MySQL डेटाबेस विकसित करेंगे और सीखेंगे कि पायथन कोड का उपयोग करके इससे डेटा कैसे प्राप्त किया जाए।
इस ट्यूटोरियल के बाद आपको क्या पता चलेगा:
-
अपने एप्लिकेशन को MySQL डेटाबेस से कनेक्ट करें
-
डेटाबेस से आवश्यक डेटा के लिए क्वेरी के माध्यम से डेटा की पुनर्प्राप्ति
-
डेटाबेस तक पहुँचने पर फेंके गए अपवादों को संभालें
इस ट्यूटोरियल का अधिकतम लाभ उठाने के लिए, यह सलाह दी जाती है कि लूपिंग, फ़ंक्शंस और अपवाद हैंडलिंग जैसी पायथन अवधारणाओं का कार्यसाधक ज्ञान होना चाहिए। आपको SQL-क्वेरी की बुनियादी समझ भी होनी चाहिए, जैसे, और . सेलेक्ट ड्रॉप क्रिएट जॉइन के लिए
MySQL की तुलना अन्य SQL डेटाबेस से करना
SQL का अर्थ है संरचित क्वेरी भाषा, रिलेशनल डेटाबेस के प्रबंधन के लिए व्यापक रूप से उपयोग की जाने वाली प्रोग्रामिंग भाषा है। आपने विभिन्न SQL-आधारित DBMS के बारे में सुना होगा: MySQL, PostgreSQL, SQLite, और SQL सर्वर। ये सभी डेटाबेस SQL मानकों का अनुपालन करते हैं लेकिन विस्तार से भिन्न हैं।
अपने ओपन-सोर्स कोड के कारण, MySQL जल्दी ही SQL समाधानों में मार्केट लीडर बन गया। MySQL वर्तमान में Google, लिंक्डइन, उबेर, नेटफ्लिक्स, ट्विटर और अन्य जैसी अधिकांश प्रसिद्ध तकनीकी फर्मों द्वारा उपयोग किया जाता है।
ओपन-सोर्स समुदाय के समर्थन के अलावा, MySQL की सफलता के अन्य कारण भी हैं:
-
स्थापित करने में आसान- MySQL को उपयोगकर्ता के अनुकूल बनाया गया है। डेटाबेस बनाना और अनुकूलित करना आसान है। MySQL विंडोज, मैकओएस, लिनक्स और सोलारिस सहित प्रमुख ऑपरेटिंग सिस्टम के लिए उपलब्ध है।
-
स्पीड- MySQL की एक तेज़ डेटाबेस समाधान होने की प्रतिष्ठा है। यह डीबीएमएस भी अच्छी तरह से स्केल करता है।
-
उपयोगकर्ता अधिकार और सुरक्षा- MySQL आपको पासवर्ड सुरक्षा स्तर सेट करने, उपयोगकर्ता खातों में विशेषाधिकार जोड़ने और हटाने की अनुमति देता है। उपयोगकर्ता अधिकार प्रबंधन कई अन्य DBMS जैसे PostgreSQL की तुलना में बहुत सरल दिखता है, जहाँ कॉन्फ़िगरेशन फ़ाइलों को प्रबंधित करने के लिए कुछ कौशल की आवश्यकता होती है।
MySQL सर्वर और MySQL कनेक्टर को स्थापित करना
MySQL सर्वर और MySQL कनेक्टर केवल दो सॉफ्टवेयर हैं जिनकी आपको इस ट्यूटोरियल के साथ शुरुआत करने की आवश्यकता है। MySQL सर्वर डेटाबेस के साथ काम करने के लिए आवश्यक संसाधन प्रदान करेगा। सर्वर शुरू करने के बाद, आप MySQL कनेक्टर/पायथन का उपयोग करके अपने पायथन एप्लिकेशन को इससे कनेक्ट करने में सक्षम होना चाहिए।
MySQL सर्वर स्थापित करना
आधिकारिक दस्तावेज MySQL सर्वर को डाउनलोड और इंस्टॉल करने के लिए अनुशंसित तरीकों का वर्णन करता है। विंडोज, मैकओएस, सोलारिस, लिनक्स और कई अन्य सहित सभी लोकप्रिय ऑपरेटिंग सिस्टम के लिए निर्देश हैं।
विंडोज के लिए, आपका सबसे अच्छा दांव MySQL इंस्टालर को डाउनलोड करना है और इसे प्रक्रिया का ध्यान रखना है। संस्थापन प्रबंधक आपके MySQL सर्वर के लिए सुरक्षा सेटिंग्स को विन्यस्त करने में भी आपकी मदद करेगा। खाता पृष्ठ पर, आपको रूट खाते के लिए एक पासवर्ड दर्ज करना होगा और यदि वांछित हो, तो अन्य उपयोगकर्ताओं को विभिन्न विशेषाधिकारों के साथ जोड़ें।
एक MySQL खाता सेट करना
अन्य उपयोगी उपकरण जैसे MySQL वर्कबेंच को इंस्टालर का उपयोग करके अनुकूलित किया जा सकता है। ऑपरेटिंग सिस्टम पर स्थापित करने का एक सुविधाजनक विकल्प डॉकर का उपयोग करके MySQL को परिनियोजित करना है।
MySQL कनेक्टर/पायथन स्थापित करना
डेटाबेस ड्राइवर - सॉफ्टवेयर जो किसी एप्लिकेशन को DBMS से कनेक्ट और इंटरैक्ट करने की अनुमति देता है। इन ड्राइवरों को आमतौर पर अलग मॉड्यूल के रूप में आपूर्ति की जाती है। मानक इंटरफ़ेस जिसे सभी पायथन डेटाबेस ड्राइवरों के अनुरूप होना चाहिए, पीईपी 249 में वर्णित है। ड्राइवर (कनेक्टर) को स्थापित करने के लिए, हम पैकेज मैनेजर का उपयोग करेंगे: पाइप
पाइप स्थापित mysql-कनेक्टर-अजगर
पाइप कनेक्टर को वर्तमान में सक्रिय वातावरण में स्थापित करेगा। एक परियोजना के साथ अलगाव में काम करने के लिए, हम एक आभासी वातावरण स्थापित करने की सलाह देते हैं।
आइए पायथन टर्मिनल में निम्न कमांड चलाकर इंस्टॉलेशन परिणाम देखें:
आयात mysql.connector
यदि आयात विवरण त्रुटियों के बिना चलता है, तो यह सफलतापूर्वक स्थापित हो गया है और उपयोग के लिए तैयार है। MySQL.connector
MySQL सर्वर से कनेक्शन स्थापित करना
MySQL एक सर्वर-साइड डेटाबेस मैनेजमेंट सिस्टम है। एक सर्वर में कई डेटाबेस हो सकते हैं। डेटाबेस के साथ बातचीत करने के लिए, हमें सर्वर से एक कनेक्शन स्थापित करना होगा। MySQL-आधारित डेटाबेस के साथ Python प्रोग्राम के लिए चरण-दर-चरण इंटरैक्शन इस तरह दिखता है:
-
हम MySQL सर्वर से जुड़ते हैं।
-
हम एक नया डेटाबेस बनाते हैं (यदि आवश्यक हो)।
-
हम डेटाबेस से जुड़ते हैं।
-
हम SQL क्वेरी निष्पादित करते हैं, परिणाम एकत्र करते हैं।
-
यदि तालिका में परिवर्तन किए गए हैं तो हम डेटाबेस को सूचित करते हैं।
-
अंत में, बस MySQL सर्वर से कनेक्शन बंद करें।
एप्लिकेशन जो भी हो, पहला कदम एप्लिकेशन और डेटाबेस को एक साथ जोड़ना है।
पायथन से MySQL सर्वर से कनेक्ट करना
कनेक्शन स्थापित करने के लिए, मॉड्यूल का उपयोग करें। यह फ़ंक्शन पैरामीटर लेता है, और, और एक ऑब्जेक्ट देता है। उपयोगकर्ता से इनपुट के परिणामस्वरूप क्रेडेंशियल प्राप्त किए जा सकते हैं: कनेक्ट () mysql.connector होस्ट उपयोगकर्ता पासवर्ड MySQLConnection
mysql.connector आयात कनेक्ट से गेटपास आयात गेटपास से, त्रुटि प्रयास करें: कनेक्ट के साथ (होस्ट = "लोकलहोस्ट", उपयोगकर्ता = इनपुट ("उपयोगकर्ता नाम:"), पासवर्ड = गेटपास ("पासवर्ड:"),) कनेक्शन के रूप में: प्रिंट (कनेक्शन) ) ई: प्रिंट (ई) के रूप में त्रुटि को छोड़कर
ऑब्जेक्ट को एक वेरिएबल में संग्रहीत किया जाता है जिसका उपयोग हम MySQL सर्वर तक पहुंचने के लिए करेंगे। कुछ महत्वपूर्ण बिंदु: MySQLConnection कनेक्शन
-
सभी डेटाबेस कनेक्शन को ब्लॉक में लपेटें। इससे किसी भी अपवाद को पकड़ना और उसकी जांच करना आसान हो जाएगा। कोशिश करो ... को छोड़कर
-
डेटाबेस तक पहुँचने के बाद कनेक्शन बंद करना याद रखें। अप्रयुक्त खुले कनेक्शन अप्रत्याशित त्रुटियों और प्रदर्शन समस्याओं का कारण बनते हैं। कोड इसके लिए संदर्भ प्रबंधक (के साथ ... के रूप में ...) का उपयोग करता है।
-
आपको पायथन लिपि में कभी भी क्रेडेंशियल (उपयोगकर्ता नाम और पासवर्ड) को स्ट्रिंग रूप में एम्बेड नहीं करना चाहिए। यह खराब परिनियोजन अभ्यास है और एक गंभीर सुरक्षा जोखिम पैदा करता है। ऊपर दिया गया कोड आपके लॉगिन क्रेडेंशियल के लिए पूछता है। इसके लिए, दर्ज किए गए पासवर्ड को छिपाने के लिए एक अंतर्निहित मॉड्यूल का उपयोग किया जाता है।
इसलिए, हमने अपने प्रोग्राम और MySQL सर्वर के बीच एक कनेक्शन स्थापित किया है। अब आपको या तो एक नया डेटाबेस बनाना होगा या किसी मौजूदा से कनेक्ट करना होगा।
एक नया डेटाबेस बनाएँ
एक नया डेटाबेस बनाने के लिए, उदाहरण के लिए एक नाम के साथ, आपको SQL कथन निष्पादित करने की आवश्यकता है: online_movie_rating
ऑनलाइन डेटाबेस बनाएं_movie_rating;
नोट
MySQL के लिए आपको एक बयान के अंत में एक अर्धविराम ( लगाना होगा। हालाँकि, MySQL कनेक्टर/पायथन स्वचालित रूप से प्रत्येक क्वेरी के अंत में एक अर्धविराम जोड़ता है।
SQL क्वेरी को निष्पादित करने के लिए, हमें एक कर्सर की आवश्यकता होती है जो डेटाबेस रिकॉर्ड तक पहुँचने की प्रक्रिया को सार करता है। MySQL Connector / Python एक संबंधित वर्ग प्रदान करता है, जिसके उदाहरण को कर्सर भी कहा जाता है। MySQL कर्सर
आइए डेटाबेस बनाने के लिए अपना अनुरोध पास करें: online_movie_rating
कोशिश करें: कनेक्ट के साथ (होस्ट = "लोकलहोस्ट", उपयोगकर्ता = इनपुट ("उपयोगकर्ता नाम:"), पासवर्ड = गेटपास ("पासवर्ड:"),) कनेक्शन के रूप में: create_db_query = "CREATE DATABASE online_movie_rating" कनेक्शन के साथ। कर्सर () कर्सर के रूप में : कर्सर.निष्पादन (create_db_query) त्रुटि को छोड़कर ई: प्रिंट (ई)
अनुरोध एक चर में एक स्ट्रिंग के रूप में संग्रहीत किया जाता है और फिर डेटाबेस बनाने के लिए निष्पादन के लिए पास किया जाता है create_db_query कर्सर.execute ()
यदि सर्वर पर समान नाम वाला डेटाबेस पहले से मौजूद है, तो हमें एक त्रुटि संदेश प्राप्त होगा। पहले की तरह ही ऑब्जेक्ट का उपयोग करते हुए, डेटाबेस में संग्रहीत सभी तालिकाओं को देखने के लिए एक क्वेरी चलाते हैं: MySQLConnection SHOW DATABASES
कोशिश करें: कनेक्ट के साथ (होस्ट = "लोकलहोस्ट", उपयोगकर्ता = इनपुट ("उपयोगकर्ता नाम:"), पासवर्ड = गेटपास ("पासवर्ड:"),) कनेक्शन के रूप में: शो_डीबी_क्वेरी = "डेटाबेस" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर में डीबी के लिए कर्सर.execute (show_db_query): प्रिंट (डीबी) त्रुटि को छोड़कर ई: प्रिंट (ई)
आउटपुट
उपयोगकर्ता नाम दर्ज करें: रूट
पास वर्ड दर्ज करें: ········
('सूचना_स्कीमा',)
('माई एसक्यूएल',)
('online_movie_rating',)
('प्रदर्शन_स्कीमा',)
('एसआईएस',)
उपरोक्त कोड हमारे MySQL सर्वर पर स्थित सभी डेटाबेस के नाम प्रिंट करेगा। हमारे उदाहरण में कमांड ने डेटाबेस को भी डंप किया है जो स्वचालित रूप से MySQL सर्वर द्वारा बनाए जाते हैं और डेटाबेस मेटाडेटा और सर्वर सेटिंग्स तक पहुंच प्रदान करते हैं। डेटाबेस दिखाएं
किसी मौजूदा डेटाबेस से कनेक्ट करना
इसलिए, हमने एक डेटाबेस बनाया है जिसे कहा जाता है। इससे कनेक्ट करने के लिए, हम कॉल को केवल एक पैरामीटर के साथ पूरक करते हैं: online_movie_rating Connect() डेटाबेस
कोशिश करें: कनेक्ट के साथ (होस्ट = "लोकलहोस्ट", उपयोगकर्ता = इनपुट ("उपयोगकर्ता नाम:"), पासवर्ड = गेटपास ("पासवर्ड:"), डेटाबेस = "ऑनलाइन_मूवी_रेटिंग",) कनेक्शन के रूप में: प्रिंट (कनेक्शन) त्रुटि को छोड़कर ई: प्रिंट (ई)
टेबल बनाना, संशोधित करना और छोड़ना
इस खंड में, हम चर्चा करते हैं कि कुछ बुनियादी प्रश्नों को करने के लिए पायथन का उपयोग कैसे करें: ',' और '।' टेबल ड्रॉप में बदलाव करें
डेटाबेस स्कीमा को परिभाषित करना
आइए मूवी रेटिंग सिस्टम के लिए डेटाबेस स्कीमा बनाकर शुरू करें। तीन तालिकाओं से युक्त डेटाबेस लें:
1. फिल्में- फिल्मों के बारे में सामान्य जानकारी:
-
Id
-
+
-
शीर्षक
-
रिहाई का वर्ष
-
शैली
-
संग्रह_इन_मी
2. समीक्षक- फिल्मों की रेटिंग प्रकाशित करने वाले लोगों के बारे में जानकारी:
-
id
-
पहला नाम
-
अंतिम नाम
3. रेटिंग- समीक्षकों द्वारा फिल्मों की रेटिंग के बारे में जानकारी:
-
Movie_id (विदेशी कुंजी)
-
समीक्षक_आईडी (विदेशी कुंजी)
-
दर्ज़ा
इस गाइड के प्रयोजनों के लिए ये तीन टेबल पर्याप्त हैं।
फिल्म रेटिंग सिस्टम आरेख
डेटाबेस में टेबल एक दूसरे से संबंधित हैं: फिल्मों और समीक्षकों के बीच कई-से-अनेक संबंध होने चाहिए: एक फिल्म को कई समीक्षकों द्वारा देखा जा सकता है, और एक समीक्षक कई फिल्मों की समीक्षा कर सकता है। तालिका रेटिंग मूवी तालिका को समीक्षक की तालिका से जोड़ती है।
CREATE TABLE स्टेटमेंट का उपयोग करके टेबल बनाना
MySQL में एक नई तालिका बनाने के लिए, हमें ऑपरेटर का उपयोग करने की आवश्यकता है। निम्नलिखित MySQL क्वेरी हमारी डेटाबेस तालिका बनाएगी: तालिका फिल्में ऑनलाइन बनाएं_movie_rating
तालिका फिल्में बनाएं (आईडी INT AUTO_INCREMENT प्राथमिक कुंजी, शीर्षक VARCHAR (100), रिलीज_वर्ष वर्ष (4), शैली VARCHAR (100), संग्रह_इन_मिल INT);
यदि आपने पहले SQL का सामना किया है, तो आप उपरोक्त क्वेरी का अर्थ समझेंगे। MySQL बोली में कुछ विशिष्ट विशेषताएं हैं। उदाहरण के लिए, MySQL डेटा प्रकारों की एक विस्तृत श्रृंखला प्रदान करता है, जिसमें शामिल हैं, और इसी तरह। इसके अलावा, MySQL कीवर्ड का उपयोग तब करता है जब नए रिकॉर्ड डालने पर कॉलम मान स्वचालित रूप से बढ़ जाना चाहिए। वर्ष INT BIGINT AUTO_INCREMENT
एक टेबल बनाने के लिए, आपको निर्दिष्ट क्वेरी को कर्सर को पास करना होगा।
create_movies_table_query = """ तालिका फिल्में बनाएं (आईडी INT INT AUTO_INCREMENT प्राथमिक कुंजी, शीर्षक VARCHAR (100), रिलीज_वर्ष वर्ष (4), शैली VARCHAR (100), संग्रह_मिल INT) """ कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित करें (create_movies_table_query) कनेक्शन। प्रतिबद्ध ()
ऑपरेटर पर ध्यान दें। डिफ़ॉल्ट रूप से, MySQL कनेक्टर लेनदेन को स्वतः-प्रतिबद्ध नहीं करता है। MySQL में, लेन-देन में उल्लिखित संशोधन केवल तभी होते हैं जब हम अंत में कमांड का उपयोग करते हैं। किसी तालिका में परिवर्तन करने के लिए, प्रत्येक लेनदेन के बाद हमेशा इस विधि को कॉल करें। कनेक्शन.कमिट () कमिट
आइए तालिका के लिए प्रक्रिया दोहराएं: समीक्षक
create_reviewers_table_query = """
क्रिएट टेबल समीक्षक (आईडी INT INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(100), last_name VARCHAR(100) ) """ कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर.execute(create_reviewers_table_query) कनेक्शन। तालिका रेटिंग: create_ratings_table_query = """ तालिका रेटिंग बनाएं ( Movie_id INT, Reviewer_id INT, रेटिंग DECIMAL(2,1), FOREIGN KEY(movie_id) संदर्भ फिल्में (id), FOREIGN KEY(reviewer_id) संदर्भ समीक्षक (आईडी), प्राथमिक कुंजी (movie_id, reviewer_id) ) """ कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (create_ratings_table_query) कनेक्शन।
MySQL में विदेशी कुंजी संबंधों का कार्यान्वयन थोड़ा अलग है और मानक SQL की तुलना में इसकी सीमाएँ हैं। MySQL में, एक विदेशी कुंजी के माता-पिता और बच्चे दोनों को एक ही स्टोरेज इंजन का उपयोग करना चाहिए - अंतर्निहित सॉफ़्टवेयर घटक जो डेटाबेस प्रबंधन प्रणाली SQL संचालन करने के लिए उपयोग करता है। MySQL दो प्रकार के ऐसे तंत्र प्रदान करता है:
-
लेन-देन भंडारण इंजन लेनदेन-सुरक्षित हैं और आपको सरल आदेशों का उपयोग करके लेनदेन को वापस करने की अनुमति देते हैं जैसे कि। कई लोकप्रिय MySQL इंजन इस श्रेणी में आते हैं, जिनमें InnoDB और NDB शामिल हैं। रोलबैक
-
गैर-लेनदेन भंडारण इंजन डेटाबेस के लिए प्रतिबद्ध बयानों को पूर्ववत करने के लिए मैन्युअल कोड पर भरोसा करते हैं। ये हैं, उदाहरण के लिए, MyISAM और MEMORY।
InnoDB सबसे लोकप्रिय डिफ़ॉल्ट स्टोरेज इंजन है। विदेशी कुंजी बाधाओं को लागू करके, यह डेटा अखंडता को बनाए रखने में मदद करता है। इसका मतलब यह है कि किसी भी विदेशी कुंजी सीआरयूडी ऑपरेशन को यह सुनिश्चित करने के लिए पूर्व-जांच किया जाता है कि यह विभिन्न तालिकाओं के बीच असंगतता का कारण नहीं बनता है।
ध्यान दें कि तालिका प्राथमिक कुंजी के रूप में एक साथ कार्य करते हुए कॉलम और दो विदेशी कुंजियों का उपयोग करती है। यह सुविधा सुनिश्चित करती है कि एक समीक्षक एक ही फिल्म को दो बार रेट नहीं कर सकता। रेटिंग movie_id समीक्षक_आईडी
एकाधिक हिट के लिए एक ही कर्सर का उपयोग किया जा सकता है। इस मामले में, सभी कॉल एक परमाणु लेनदेन बन जाएंगे। उदाहरण के लिए, आप एक कर्सर के साथ सभी कथनों को निष्पादित कर सकते हैं, और फिर एक ही बार में लेनदेन कर सकते हैं:
कनेक्शन के साथ तालिका बनाएं। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (create_movies_table_query) कर्सर।
DESCRIBE स्टेटमेंट का उपयोग करके टेबल स्कीमा प्रदर्शित करना
हमने तीन टेबल बनाए हैं और ऑपरेटर का उपयोग करके स्कीमा देख सकते हैं। वर्णन करना
मान लें कि आपके पास पहले से ही एक चर में एक वस्तु है, हम प्राप्त परिणामों को प्रिंट कर सकते हैं। यह विधि अंतिम निष्पादित कथन से सभी पंक्तियों को पुनः प्राप्त करती है: MySQLConnection कनेक्शन कर्सर.fetchall ()
शो_टेबल_क्वेरी = "डिस्क्राइब मूवीज़" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। एक्सक्यूट (शो_टेबल_क्वेरी) # अंतिम निष्पादित क्वेरी परिणाम से पंक्तियाँ प्राप्त करें = परिणाम में पंक्ति के लिए कर्सर। फ़ेचॉल (): प्रिंट (पंक्ति)
आउटपुट
('id', 'int(11)', 'NO', 'PRI', कोई नहीं, 'auto_increment')
('शीर्षक', 'वर्चर (100)', 'हाँ', "कोई नहीं,")
('रिलीज_इयर', 'वर्ष (4)', 'हां', "कोई नहीं,")
('शैली', 'वर्चर (100)', 'हां', "कोई नहीं,")
('संग्रह_इन_मिल', 'इंट(11)', 'हां', "कोई नहीं,")
उपरोक्त कोड को निष्पादित करने के बाद, हमें तालिका में कॉलम के बारे में जानकारी वाली एक तालिका मिलनी चाहिए। प्रत्येक कॉलम के लिए, डेटा प्रकार के बारे में जानकारी प्रदर्शित होती है, चाहे कॉलम प्राथमिक कुंजी हो, इत्यादि। चलचित्र
ALTER कथन का उपयोग करके तालिका का स्कीमा बदलना
तालिका में नाम कॉलम में लाखों डॉलर में फिल्म का बॉक्स ऑफिस है। हम एक विशेषता के डेटा प्रकार को संग्रह_इन_मिल मूवी संग्रह_इन_मिल INT DECIMAL से बदलने के लिए निम्नलिखित MySQL कथन लिख सकते हैं
ALTER TABLE मूवी COLUMN संग्रह को संशोधित करें_in_mil DECIMAL(4,1);
DECIMAL(4,1) एक दशमलव संख्या को इंगित करता है, जिसमें अधिकतम चार अंक हो सकते हैं, जिनमें से एक दसवें डिस्चार्ज से मेल खाता है, उदाहरण के लिए, और इसी तरह। डी। 120.1 3.4 38.0
परिवर्तन_टेबल_क्वेरी = """ वैकल्पिक तालिका फिल्में कॉलम संग्रह को संशोधित करें_इन_मिल दशमलव (4,1) """ शो_टेबल_क्वेरी = "डिस्क्राइब फिल्में" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (alter_table_query) कर्सर। निष्पादित (शो_टेबल_क्वेरी) # पंक्तियां प्राप्त करें अंतिम निष्पादित क्वेरी परिणाम से = कर्सर.फ़ेचॉल () प्रिंट ("संशोधन के बाद मूवी टेबल स्कीमा:") परिणाम में पंक्ति के लिए: प्रिंट (पंक्ति) परिवर्तन करने के बाद मूवी टेबल स्कीमा: ('id', 'int(11) ', 'NO', 'PRI', कोई नहीं, 'auto_increment') ('title', 'varchar(100)', 'YES', '', none, '') ('release_year', 'year(4)) ', 'हाँ', '', कोई नहीं, '') ('शैली', 'वर्चर (100)', 'हाँ', '', कोई नहीं, '') ('संग्रह_इन_मिल', 'दशमलव (4,1) ', 'हाँ', '', कोई नहीं, '')
जैसा कि आउटपुट में दिखाया गया है, विशेषता ने अपना प्रकार भी बदल दिया है। ध्यान दें कि उपरोक्त कोड में, हम दो बार कॉल कर रहे हैं, लेकिन केवल हाल ही में निष्पादित क्वेरी से पंक्तियां प्राप्त करता है, जो है। संग्रह_इन_मिल दशमलव (4,1) कर्सर.निष्पादन () कर्सर.फ़ेचॉल () show_table_query
DROP कथन का उपयोग करके तालिकाएँ गिराना
तालिकाओं को हटाने के लिए, ऑपरेटर का उपयोग करें। तालिका गिराना एक अपरिवर्तनीय प्रक्रिया है। यदि आप नीचे दिए गए कोड को चलाते हैं, तो आपको फिर से टेबल पर क्वेरी को इनवाइट करना होगा: DROP TABLE CREATE TABLE रेटिंग्स
drop_table_query = "ड्रॉप टेबल रेटिंग" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (ड्रॉप_टेबल_क्वेरी)
तालिकाओं में रिकॉर्ड सम्मिलित करना
आइए तालिकाओं को डेटा से भरें। इस खंड में, हम पायथन कोड में MySQL कनेक्टर का उपयोग करके रिकॉर्ड डालने के दो तरीके देखेंगे।
रिकॉर्ड की संख्या कम होने पर पहली विधि अच्छी तरह से काम करती है। दूसरा वास्तविक जीवन परिदृश्यों के लिए बेहतर अनुकूल है। .execute() .executemany()
.execute () के साथ रिकॉर्ड सम्मिलित करना
पहला दृष्टिकोण उसी विधि का उपयोग करता है जिसका उपयोग हम अब तक करते रहे हैं। हम एक अनुरोध लिखते हैं और इसे cursor.execute() को भेजते हैं INSERT INTO cursor.execute()
Insert_movies_query = """ फिल्मों में सम्मिलित करें (शीर्षक, रिलीज_वर्ष, शैली, संग्रह_मिल) मान ("फॉरेस्ट गंप", 1994, "ड्रामा", 330.2), ("3 इडियट्स", 2009, "ड्रामा", 2.4), (" इटरनल सनशाइन ऑफ द स्पॉटलेस माइंड", 2004, "ड्रामा", 34.5), ("गुड विल हंटिंग", 1997, "ड्रामा", 138.1), ("स्काईफॉल", 2012, "एक्शन", 304.6), ("ग्लेडिएटर ", 2000, "एक्शन", 188.7), ("ब्लैक", 2005, "ड्रामा", 3.0), ("टाइटैनिक", 1997, "रोमांस", 659.2), ("द शशांक रिडेम्पशन", 1994, "ड्रामा ",28.4), ("उड़ान", 2010, "ड्रामा", 1.5), ("होम अलोन", 1990, "कॉमेडी", 286.9), ("कैसाब्लांका", 1942, "रोमांस", 1.0), (" एवेंजर्स: एंडगेम", 2019, "एक्शन", 858.8), ("नाइट ऑफ द लिविंग डेड", 1968, "हॉरर", 2.5), ("द गॉडफादर", 1972, "क्राइम", 135.6), ("हैदर ", 2014, "एक्शन", 4.2), ("इंसेप्शन", 2010, "एडवेंचर", 293.7), ("एविल", 2003, "हॉरर", 1.3), ("टॉय स्टोरी 4", 2019, "एनीमेशन ", 434.9), ("एयर फ़ोर्स वन", 1997, "ड्रामा", 138.1), ("द डार्क नाइट", 2008, "एक्शन",535.4), ("भाग मिल्खा भाग", 2013, "स्पोर्ट", 4.1), ("द लायन किंग", 1994, "एनिमेशन", 423.6), ("पल्प फिक्शन", 1994, "क्राइम", 108.8), ("काई पो चे", 2013, "स्पोर्ट", 6.0), ("बीस्ट्स ऑफ नो नेशन", 2015, "वॉर", 1.4), ("अंडाधुन", 2018, "थ्रिलर", 2.9), ("द साइलेंस ऑफ द लैम्ब्स", 1991, "क्राइम", 68.2), ( "डेडपूल", 2016, "एक्शन", 363.6), ("दृश्यम", 2015, "मिस्ट्री", 3.0) """ कर्सर के रूप में कनेक्शन.कर्सर() के साथ: कर्सर.execute(insert_movies_query) कनेक्शन.commit()
तालिका अब तीस प्रविष्टियों से भर गई है। अंत में, कोड कॉल करता है। तालिका में कोई भी परिवर्तन करने के बाद कॉल करना न भूलें। फिल्में कनेक्शन। प्रतिबद्ध ()। प्रतिबद्ध ()
.executemany () के साथ रिकॉर्ड सम्मिलित करना
पिछला दृष्टिकोण छोटे रिकॉर्ड के लिए उपयुक्त है जिसे कोड के माध्यम से आसानी से डाला जा सकता है। लेकिन आमतौर पर, डेटा एक फ़ाइल में संग्रहीत होता है या किसी अन्य स्क्रिप्ट द्वारा उत्पन्न होता है। यहां यह काम आता है। विधि दो पैरामीटर लेती है: .executemany()
-
अभिलेखों को सम्मिलित करने के लिए प्लेसहोल्डर वाली एक क्वेरी।
-
सम्मिलित करने के लिए अभिलेखों की सूची।
आइए तालिका को भरने के लिए एक दृष्टिकोण लें: समीक्षक
Insert_reviewers_query = """ समीक्षकों में सम्मिलित करें (प्रथम_नाम, अंतिम_नाम) मान ( %s, %s ) """ समीक्षक_रिकॉर्ड्स = [ ("चैतन्य", "बावेजा"), ("मैरी", "कूपर"), ("जॉन ", "वेन"), ("थॉमस", "स्टोनमैन"), ("पेनी", "हॉफस्टैटर"), ("मिशेल", "मार्श"), ("व्याट", "स्केग्स"), ("आंद्रे ", "वेइगा"), ("शेल्डन", "कूपर"), ("किम्ब्रा", "मास्टर्स"), ("कैट", "डेनिंग्स"), ("ब्रूस", "वेन"), ("डोमिंगो") ", "कोर्टेस"), ("राजेश", "कुथ्रप्पली"), ("बेन", "ग्लॉकर"), ("महिंदर", "धोनी"), ("अकबर", "खान"), ("हावर्ड ", "वोलोविट्ज़"), ("पिंकी", "पेटिट"), ("गुरकरन", "सिंह"), ("एमी", "फराह फाउलर"), ("मार्लोन", "क्रैफर्ड"), ] साथ में कनेक्शन.कर्सर() कर्सर के रूप में: कर्सर.executemany(insert_reviewers_query, reviewers_records) कनेक्शन.commit()
यह कोड प्लेसहोल्डर्स को दो स्ट्रिंग्स के लिए लेता है जो इसमें डाले जाते हैं। प्लेसहोल्डर प्रारूप विनिर्देशक के रूप में कार्य करते हैं और एक स्ट्रिंग के भीतर एक चर के लिए स्थान आरक्षित करने में मदद करते हैं। %s सम्मिलित_समीक्षक_क्वेरी
आइए तालिका को इसी तरह भरें: रेटिंग
इन्सर्ट_रेटिंग्स_क्वेरी = """ रेटिंग्स में डालें (रेटिंग, मूवी_आईडी, समीक्षक_आईडी) मान (%s, %s, %s) """ रेटिंग्स_रिकॉर्ड्स = [ (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) ] कनेक्शन के साथ। कर्सर() कर्सर के रूप में : कर्सर.executemany(insert_ratings_query, रेटिंग्स_records) कनेक्शन.commit()
तीनों टेबल अब डेटा से भर गए हैं। अगला कदम यह पता लगाना है कि इस डेटाबेस के साथ कैसे इंटरैक्ट किया जाए।
डेटाबेस से रिकॉर्ड पढ़ना
अब तक, हमने केवल डेटाबेस आइटम बनाए हैं। यह कुछ प्रश्नों को चलाने और उन गुणों को खोजने का समय है जिनमें हम रुचि रखते हैं। इस खंड में, हम सीखेंगे कि ऑपरेटर का उपयोग करके डेटाबेस तालिकाओं से रिकॉर्ड कैसे पढ़ा जाए। चुनते हैं
एक सेलेक्ट स्टेटमेंट के साथ रिकॉर्ड पढ़ना
रिकॉर्ड प्राप्त करने के लिए, आपको अनुरोध को भेजने और परिणाम का उपयोग करके वापस करने की आवश्यकता है: कर्सर.execute () कर्सर चुनें। प्राप्त करें ()
select_movies_query = "चयन * फिल्मों से LIMIT 5" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (select_movies_query) परिणाम = कर्सर। परिणाम में पंक्ति के लिए (): प्रिंट (पंक्ति)
आउटपुट
(१, 'फॉरेस्ट गंप', 1, 'ड्रामा', दशमलव ('1994'))
(2, '3 इडियट्स', 2009, 'ड्रामा', डेसीमल ('2.4'))
(३, 'अनन्त सनशाइन ऑफ़ द स्पॉटलेस माइंड', २००४, 'ड्रामा', दशमलव ('३४.५'))
(४, 'गुड विल हंटिंग', 4, 'ड्रामा', दशमलव ('1997'))
(5, 'स्काईफॉल', 2012, 'एक्शन', दशमलव ('304.6'))
चर में लौटाए गए रिकॉर्ड शामिल हैं। यह एक तालिका में व्यक्तिगत रिकॉर्ड का प्रतिनिधित्व करने वाले टुपल्स की एक सूची है। परिणाम .fetchall ()
उपरोक्त क्वेरी में, हम ऑपरेटर से प्राप्त पंक्तियों की संख्या को सीमित करने के लिए एक कीवर्ड का उपयोग करते हैं। बड़ी मात्रा में डेटा संसाधित करते समय डेवलपर्स को अक्सर आउटपुट को पेजेट करने के लिए उपयोग किया जाता है। सीमा चयन सीमा
MySQL में, दो गैर-ऋणात्मक संख्यात्मक तर्क एक ऑपरेटर को दिए जा सकते हैं: LIMIT
चुनें * फिल्मों से LIMIT 2,5;
दो संख्यात्मक तर्कों का उपयोग करते समय, पहला ऑफ़सेट निर्दिष्ट करता है, जो इस उदाहरण में 2 है, और दूसरी पंक्तियों की संख्या को 5 तक सीमित करता है। यानी, उदाहरण से क्वेरी 3 से 7 पंक्तियों को वापस कर देगी।
select_movies_query = "चुनें शीर्षक, फिल्मों से रिलीज_वर्ष LIMIT 2, 5" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर में पंक्ति के लिए कर्सर। निष्पादित (select_movies_query)।
आउटपुट
('अनन्त सनशाइन ऑफ़ द स्पॉटलेस माइंड', 2004)
('गुड विल हंटिंग', 1997)
('स्काईफॉल', 2012)
('ग्लेडिएटर', 2000)
('ब्लैक', 2005)
WHERE . के साथ परिणाम फ़िल्टर करना
तालिका प्रविष्टियों का उपयोग करके भी फ़िल्टर किया जा सकता है। $ 300 मिलियन से अधिक के बॉक्स ऑफिस वाली सभी फिल्मों को प्राप्त करने के लिए, निम्न क्वेरी चलाएँ: WHERE
select_movies_query = """ फिल्मों से संग्रह_इन_मिल का चयन करें जहां संग्रह_इन_मिल> संग्रह_इन_मिल डीईएससी द्वारा 300 ऑर्डर """ कर्सर के रूप में कनेक्शन.कर्सर () के साथ: कर्सर में मूवी के लिए कर्सर.एक्सक्यूट (select_movies_query)। ('एवेंजर्स: एंडगेम', दशमलव ('858.8')) ('टाइटैनिक', दशमलव ('659.2')) ('द डार्क नाइट', दशमलव ('535.4')) ('टॉय स्टोरी 4', दशमलव (') 434.9')) ('द लायन किंग', दशमलव ('423.6')) ('डेडपूल', दशमलव ('363.6')) ('फॉरेस्ट गंप', दशमलव ('330.2')) ('स्काईफॉल', दशमलव ( '304.6'))
क्वेरी में वाक्यांश आपको शुल्क को उच्चतम से निम्नतम तक क्रमबद्ध करने की अनुमति देता है। द्वारा आदेश
MySQL कई स्ट्रिंग स्वरूपण संचालन प्रदान करता है जैसे कि स्ट्रिंग संयोजन के लिए। उदाहरण के लिए, भ्रम से बचने के लिए फिल्म के शीर्षक आमतौर पर रिलीज वर्ष के साथ प्रदर्शित किए जाते हैं। आइए जानते हैं पांच सबसे ज्यादा मुनाफा कमाने वाली फिल्मों के नाम और उनकी रिलीज की तारीखें: CONCAT
select_movies_query = """ CONCAT (शीर्षक, "(,", रिलीज_इयर, ")"), संग्रह_इन_मिल फिल्मों से ऑर्डर करें DESC LIMIT 5 "" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर के रूप में। कर्सर में। फ़ेचॉल (): प्रिंट (मूवी)
आउटपुट
('एवेंजर्स: एंडगेम (2019)', दशमलव ('858.8'))
('टाइटैनिक (1997)', दशमलव ('659.2'))
('द डार्क नाइट (2008)', दशमलव ('535.4'))
('टॉय स्टोरी 4 (2019)', दशमलव ('434.9'))
('द लायन किंग (1994)', दशमलव ('423.6'))
यदि आप उपयोग नहीं करना चाहते हैं और सभी रिकॉर्ड प्राप्त करने की आवश्यकता नहीं है, तो आप कर्सर विधियों का उपयोग कर सकते हैं और: LIMIT .fetchone() .fetchmany()
-
.fetchone() परिणाम की अगली पंक्ति को टपल के रूप में प्राप्त करता है, या यदि कोई और पंक्तियाँ उपलब्ध नहीं हैं। कोई नहीं
-
.fetchmany() पंक्तियों के अगले सेट की सूची को टपल के रूप में प्राप्त करता है। ऐसा करने के लिए, इसे एक तर्क दिया जाता है, जो डिफ़ॉल्ट रूप से 1 होता है। यदि कोई और पंक्तियाँ उपलब्ध नहीं हैं, तो विधि एक खाली सूची लौटाती है।
फिर से, साल के हिसाब से पांच सबसे ज्यादा कमाई करने वाली फिल्मों के शीर्षक निकालें, लेकिन इस बार का उपयोग करके: .fetchmany()
select_movies_query = """ CONCAT (शीर्षक, " (", रिलीज_इयर, ")") चुनें, संग्रह_इन_मिल फिल्मों से ऑर्डर करें संग्रह_इन_मिल डीईएससी """ के साथ कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर में फिल्म के लिए कर्सर। निष्पादित (select_movies_query) .fetchmany(आकार=5): प्रिंट(मूवी)कर्सर.fetchall()
आउटपुट
('एवेंजर्स: एंडगेम (2019)', दशमलव ('858.8'))
('टाइटैनिक (1997)', दशमलव ('659.2'))
('द डार्क नाइट (2008)', दशमलव ('535.4'))
('टॉय स्टोरी 4 (2019)', दशमलव ('434.9'))
('द लायन किंग (1994)', दशमलव ('423.6'))
आपने एक अतिरिक्त चुनौती पर ध्यान दिया होगा। हम किसी भी शेष अपठित परिणामों को साफ़ करने के लिए ऐसा करते हैं। कर्सर.फ़ेचॉल () .fetchmany ()
उसी कनेक्शन पर कोई अन्य कथन निष्पादित करने से पहले, आपको सभी अपठित परिणामों को साफ़ करना होगा। अन्यथा, एक अपवाद फेंक दिया जाता है। आंतरिक त्रुटि
एकाधिक तालिकाओं में शामिल हों
पांच उच्चतम रेटेड फिल्मों के नाम जानने के लिए, निम्न क्वेरी चलाएँ:
select_movies_query = """ औसत के रूप में शीर्षक, औसत (रेटिंग) का चयन करें रेटिंग से INNER फिल्मों पर फिल्मों में शामिल हों। कर्सर में मूवी के लिए निष्पादित (select_movies_query) करें। फ़ेचॉल (): प्रिंट (मूवी)
आउटपुट
('नाइट ऑफ़ द लिविंग डेड', दशमलव ('9.90000'))
('द गॉडफादर', दशमलव ('9.90000'))
('एवेंजर्स: एंडगेम', दशमलव ('9.75000'))
('अनन्त सनशाइन ऑफ़ द स्पॉटलेस माइंड', दशमलव ('8.90000'))
('बीस्ट्स ऑफ नो नेशन', दशमलव ('8.70000'))
आप इस तरह से सबसे अधिक रेटिंग वाले समीक्षक का नाम पा सकते हैं:
select_movies_query = """ CONCAT(first_name, " ", last_name), COUNT(*) को समीक्षकों से संख्या के रूप में चुनें। कर्सर () कर्सर के रूप में: कर्सर में मूवी के लिए कर्सर.एक्सक्यूट (select_movies_query)। फ़ेचॉल (): प्रिंट (मूवी) ('मैरी कूपर', 1)
जैसा कि आप देख सकते हैं, अधिकांश समीक्षाएँ मैरी कूपर द्वारा लिखी गई थीं।
किसी क्वेरी को निष्पादित करने की प्रक्रिया हमेशा समान रहती है: हम परिणाम प्राप्त करने के लिए क्वेरी पास करते हैं। कर्सर.निष्पादन () .fetchall ()
डेटाबेस से रिकॉर्ड अपडेट करना और हटाना
इस खंड में, हम कुछ प्रविष्टियों को अपडेट और हटा देंगे। हम कीवर्ड का उपयोग करके आवश्यक पंक्तियों का चयन करेंगे। कहां
अद्यतन आदेश
कल्पना कीजिए कि एक समीक्षक एमी फराह फाउलर ने शेल्डन कूपर से शादी की है। उसने अपना अंतिम नाम कूपर में बदल दिया और हमें डेटाबेस को अपडेट करने की आवश्यकता है। MySQL में रिकॉर्ड अपडेट करने के लिए, ऑपरेटर का उपयोग करें: UPDATE
update_query = """ अद्यतन समीक्षक SET last_name = "कूपर" जहां first_name = "एमी" """ कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (अपडेट_क्वेरी) कनेक्शन। प्रतिबद्ध ()
कोड अद्यतन अनुरोध को पास करता है और तालिका में आवश्यक परिवर्तन करता है। कर्सर.निष्पादन () .commit () समीक्षक
मान लें कि हम समीक्षकों को ग्रेड बदलने की अनुमति देना चाहते हैं। कार्यक्रम जानने की जरूरत है, और नया। SQL उदाहरण: movie_id समीक्षक_आईडी रेटिंग
अद्यतन रेटिंग रेटिंग सेट करें = 5.0 जहां movie_id = 18 और समीक्षक_आईडी = 15; चुनें * रेटिंग से जहां movie_id = 18 और समीक्षक_आईडी = 15; निर्दिष्ट प्रश्न पहले रेटिंग को अपडेट करते हैं और फिर अपडेटेड को आउटपुट करते हैं। आइए एक पायथन स्क्रिप्ट लिखें जो हमें ग्रेड समायोजित करने की अनुमति देगी: mysql.connector से getpass आयात गेटपास से mod_ratings.py आयात कनेक्ट, त्रुटि movie_id = इनपुट ("मूवी आईडी दर्ज करें:") समीक्षक_आईडी = इनपुट ("समीक्षक आईडी दर्ज करें:" ) new_rating = इनपुट ("नई रेटिंग दर्ज करें:") update_query = """ अद्यतन रेटिंग सेट रेटिंग = "% s" जहां movie_id = "% s" और समीक्षक_आईडी = "% s"; चुनें * रेटिंग से जहां movie_id = "% s" और समीक्षक_आईडी = "%s" """% (new_rating, movie_id, समीक्षक_आईडी, movie_id, समीक्षक_आईडी,) कोशिश करें: कनेक्ट के साथ (होस्ट = "लोकलहोस्ट", उपयोगकर्ता = इनपुट ("उपयोगकर्ता नाम दर्ज करें:"), पासवर्ड = गेटपास ("पासवर्ड दर्ज करें:"), डेटाबेस = "ऑनलाइन_मूवी_रेटिंग", ) कनेक्शन के रूप में: कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर में परिणाम के लिए। एक्ज़ीक्यूट (अपडेट_क्वेरी, मल्टी = ट्रू): यदि result.with_rows: प्रिंट (result. fetchall ()) कनेक्शन.commit () ई के रूप में त्रुटि को छोड़कर: प्रिंट (ई)
आउटपुट
मूवी आईडी दर्ज करें: 18
समीक्षक आईडी दर्ज करें: 15
नई रेटिंग दर्ज करें: 5
उपयोगकर्ता नाम दर्ज करें: रूट
पास वर्ड दर्ज करें: ········
[(१८, १५, दशमलव ('18'))]
एक ही कर्सर को कई अनुरोध पास करने के लिए, हम तर्क के लिए एक मान निर्दिष्ट करते हैं। इस मामले में, यह एक पुनरावर्तक देता है। इटरेटर में प्रत्येक आइटम एक कर्सर ऑब्जेक्ट से मेल खाता है जो अनुरोध में दिए गए निर्देश को निष्पादित करता है। उपरोक्त कोड प्रत्येक कर्सर ऑब्जेक्ट के लिए कॉल करते हुए, इस इटरेटर पर एक लूप शुरू करता है। मल्टी ट्रू कर्सर.एक्सक्यूट () .fetchall () के लिए
यदि ऑपरेशन के लिए कोई परिणाम सेट प्राप्त नहीं होता है, तो एक अपवाद फेंक दिया जाता है। इस त्रुटि से बचने के लिए, ऊपर दिए गए कोड में, हम एक संपत्ति का उपयोग करते हैं जो इंगित करता है कि अंतिम प्रदर्शन किए गए ऑपरेशन ने पंक्तियों को बनाया है या नहीं। .fetchall() कर्सर.with_rows
जबकि यह कोड काम करता है, निर्देश, जैसा कि यह खड़ा है, हैकर्स के लिए एक आकर्षक लक्ष्य है। यह एक SQL इंजेक्शन हमले के लिए असुरक्षित है जो हमलावरों को डेटाबेस को भ्रष्ट या दुरुपयोग करने की अनुमति दे सकता है। कहां
उदाहरण के लिए, यदि उपयोगकर्ता सबमिट करता है, और इनपुट के रूप में, तो परिणाम इस तरह दिखेगा: movie_id = 18 समीक्षक_आईडी = 15 रेटिंग = 5.0
$ अजगर modify_ratings.py
मूवी आईडी दर्ज करें: 18
समीक्षक आईडी दर्ज करें: 15
नई रेटिंग दर्ज करें: 5.0
उपयोगकर्ता नाम दर्ज करें:
पास वर्ड दर्ज करें:
[(१८, १५, दशमलव ('18'))]
के लिए स्कोर और भी बदल गया। लेकिन अगर आप एक हैकर थे, तो आप इनपुट में एक छिपी हुई कमांड भेज सकते थे: movie_id = 18 समीक्षक_आईडी = 15 5.0
$ अजगर modify_ratings.py
मूवी आईडी दर्ज करें: 18
समीक्षक आईडी दर्ज करें: 15″; अद्यतन समीक्षक SET last_name = “A
नई रेटिंग दर्ज करें: 5.0
उपयोगकर्ता नाम दर्ज करें:
पास वर्ड दर्ज करें:
[(१८, १५, दशमलव ('18'))]
फिर से, आउटपुट से पता चलता है कि रिपोर्ट की गई रेटिंग को 5.0 में बदल दिया गया है। किया बदल गया?
हैकर ने डेटा अपडेट अनुरोध को इंटरसेप्ट किया। एक अद्यतन अनुरोध समीक्षक की तालिका में सभी रिकॉर्ड बदल देगा: last_name "A"
>>> select_query = """
... पहले_नाम का चयन करें, अंतिम_नाम का चयन करें
... समीक्षकों से
... """
>>> कनेक्शन के साथ। कर्सर () कर्सर के रूप में:
... कर्सर.निष्पादित करें (select_query)
... कर्सर.fetchall () में समीक्षक के लिए:
... प्रिंट (समीक्षक)
...
('चैतन्य', 'ए')
('मैरी', 'ए')
('जॉन', 'ए')
('थॉमस', 'ए')
('पेनी', 'ए')
('मिशेल', 'ए')
('व्याट', 'ए')
('आंद्रे', 'ए')
('शेल्डन', 'ए')
('किम्ब्रा', 'ए')
('कैट', 'ए')
('ब्रूस', 'ए')
('डोमिंगो', 'ए')
('राजेश', 'ए')
('बेन', 'ए')
('महिंद्र', 'ए')
('अकबर', 'ए')
('हावर्ड', 'ए')
('पिंकी', 'ए')
('गुरकरन', 'ए')
('एमी', 'ए')
('मार्लोन', 'ए')
उपरोक्त कोड समीक्षकों की तालिका में प्रदर्शित करता है और सभी रिकॉर्ड के लिए। एक SQL इंजेक्शन हमले ने इस तालिका को दूषित कर दिया, सभी रिकॉर्ड को "A" में बदल दिया। प्रथम_नाम अंतिम_नाम अंतिम_नाम
ऐसे हमलों को रोकने के लिए एक त्वरित समाधान है। उपयोगकर्ता द्वारा प्रदत्त क्वेरी मान सीधे क्वेरी स्ट्रिंग में न जोड़ें। .execute() को तर्क के रूप में अनुरोध मान भेजकर स्क्रिप्ट को अपडेट करना बेहतर है
mysql.connector आयात कनेक्ट से गेटपास आयात गेटपास से mod_ratings.py, त्रुटि movie_id = इनपुट ("मूवी आईडी दर्ज करें:") समीक्षक_आईडी = इनपुट ("समीक्षक आईडी दर्ज करें:") new_rating = इनपुट ("नई रेटिंग दर्ज करें:") update_query = """ रेटिंग अपडेट करें रेटिंग सेट करें =% s जहां movie_id =% s और समीक्षक_आईडी =% s; चुनें * रेटिंग से जहां movie_id =% s और समीक्षक_आईडी =% s "" "val_tuple = ( new_rating, movie_id, समीक्षक_आईडी, movie_id, समीक्षक_आईडी) ,) कोशिश करें: कनेक्ट के साथ (होस्ट = "लोकलहोस्ट", उपयोगकर्ता = इनपुट ("उपयोगकर्ता नाम दर्ज करें:"), पासवर्ड = गेटपास ("पासवर्ड दर्ज करें:"), डेटाबेस = "ऑनलाइन_मूवी_रेटिंग",) कनेक्शन के रूप में: कनेक्शन के साथ। कर्सर ( ) कर्सर के रूप में: कर्सर में परिणाम के लिए।
ध्यान दें कि प्लेसहोल्डर अब स्ट्रिंग कोट्स में संलग्न नहीं हैं। सत्यापित करता है कि तर्क के रूप में दिए गए टपल में मान आवश्यक डेटा प्रकार के हैं। यदि उपयोक्ता कुछ समस्याग्रस्त पात्रों को दर्ज करने का प्रयास करता है, तो कोड एक अपवाद देगा: %s कर्सर.execute ()
आउटपुट
$ अजगर modify_ratings.py
मूवी आईडी दर्ज करें: 18
समीक्षक आईडी दर्ज करें: 15″; अद्यतन समीक्षक SET last_name = “A
नई रेटिंग दर्ज करें: 5.0
उपयोगकर्ता नाम दर्ज करें:
पास वर्ड दर्ज करें:
१२९२ (२२००७): काटे गए गलत डबल मान: '1292";
जब आप अनुरोध में उपयोगकर्ता इनपुट शामिल करते हैं तो इस दृष्टिकोण का हमेशा उपयोग किया जाना चाहिए। SQL इंजेक्शन हमलों को रोकने के अन्य तरीकों के बारे में जानने के लिए समय निकालें।
रिकॉर्ड हटाना: DELETE कमांड
अभिलेखों को हटाने की प्रक्रिया उन्हें अद्यतन करने के समान ही है। चूंकि यह एक अपरिवर्तनीय कार्रवाई है, इसलिए हम अनुशंसा करते हैं कि आप पहले उसी फ़िल्टर के साथ क्वेरी चलाएँ ताकि यह सुनिश्चित हो सके कि आप अपने इच्छित रिकॉर्ड को हटा रहे हैं। उदाहरण के लिए, सभी मूवी रेटिंग, डेटा को हटाने के लिए, हम पहले उपयुक्त क्वेरी चला सकते हैं: DELETE SELECT Reviewer_id = 7 SELECT
select_movies_query = """ रेटिंग से समीक्षक_आईडी, मूवी_आईडी का चयन करें, जहां की समीक्षा_आईडी = 7 """ कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर में फिल्म के लिए कर्सर.execute (select_movies_query)।
आउटपुट
(2, 7)
(2, 8)
(2, 12)
(2, 23)
उपरोक्त कोड स्निपेट एक जोड़ी प्रदर्शित करता है, और तालिका अनुमानों में प्रविष्टियों के लिए, जिसके लिए। यह सुनिश्चित करने के बाद कि ये हटाए जाने वाले रिकॉर्ड हैं, आइए उसी फ़िल्टर के साथ क्वेरी निष्पादित करें: समीक्षक_आईडी मूवी_आईडी समीक्षक_आईडी = 2 हटाएं
delete_query = "रेटिंग से हटाएं जहां समीक्षक_आईडी = 2" कनेक्शन के साथ। कर्सर () कर्सर के रूप में: कर्सर। निष्पादित (delete_query) कनेक्शन। प्रतिबद्ध ()
पायथन और MySQL को जोड़ने के अन्य तरीके
इस ट्यूटोरियल में, हमने MySQL Connector / Python की शुरुआत की, जो कि Python एप्लिकेशन से MySQL डेटाबेस के साथ इंटरैक्ट करने का आधिकारिक तौर पर अनुशंसित माध्यम है। यहां कुछ अन्य लोकप्रिय कनेक्टर दिए गए हैं:
-
mysqlclient एक पुस्तकालय है जो आधिकारिक कनेक्टर के लिए एक प्रतियोगी है और सक्रिय रूप से नए कार्यों के साथ पूरक किया जा रहा है। चूंकि पुस्तकालय का मूल सी में लिखा गया है, इसलिए इसका आधिकारिक शुद्ध पायथन कनेक्टर की तुलना में बेहतर प्रदर्शन है। बड़ी कमी यह है कि mysqlclient को स्थापित करना और स्थापित करना काफी मुश्किल है, खासकर विंडोज़ पर।
-
MySQLdb लीगेसी सॉफ़्टवेयर है जो आज भी व्यावसायिक अनुप्रयोगों में उपयोग किया जाता है। सी और तेज़ MySQL कनेक्टर/पायथन में लिखा गया है, लेकिन केवल पायथन 2 के लिए उपलब्ध है।
ये ड्राइवर आपके प्रोग्राम और MySQL डेटाबेस के बीच इंटरफेस के रूप में कार्य करते हैं। वास्तव में, आप केवल उनके माध्यम से अपने SQL प्रश्न भेजते हैं। हालाँकि, कई डेवलपर डेटा प्रबंधन के लिए ऑब्जेक्ट-ओरिएंटेड प्रतिमान का उपयोग करना पसंद करते हैं, SQL क्वेरीज़ को नहीं।
ऑब्जेक्ट-रिलेशनल मैपिंग (ओआरएम) एक ऐसी प्रक्रिया है जो न केवल क्वेरी की अनुमति देती है बल्कि सीधे ओओपी का उपयोग करके डेटाबेस से डेटा के हेरफेर की भी अनुमति देती है। ORM लाइब्रेरी डेटा में हेरफेर करने के लिए आवश्यक कोड को इनकैप्सुलेट करती है, डेवलपर्स को SQL क्वेरी का उपयोग करने की आवश्यकता से मुक्त करती है। यहाँ पायथन और एसक्यूएल के संयोजन के लिए सबसे लोकप्रिय ओआरएम पुस्तकालय हैं:
-
SQLAlchemy एक ORM है जो Python और अन्य SQL डेटाबेस के बीच संचार को सरल करता है। आप विभिन्न डेटाबेस जैसे MySQL, PostgreSQL, SQLite, आदि के लिए अलग-अलग इंजन बना सकते हैं।
-
peewee एक साधारण कॉन्फ़िगरेशन के साथ एक हल्का और तेज़ ORM लाइब्रेरी है, जो बहुत उपयोगी है जब डेटाबेस के साथ आपकी बातचीत कुछ रिकॉर्ड लाने तक सीमित है। यदि आपको किसी MySQL डेटाबेस से CSV फ़ाइल में अलग-अलग रिकॉर्ड कॉपी करने की आवश्यकता है, तो peewee सबसे अच्छा विकल्प है।
-
Django ORM, Django वेब ढांचे के सबसे शक्तिशाली भागों में से एक है, जो आपको विभिन्न प्रकार के SQLite, PostgreSQL और MySQL डेटाबेस के साथ आसानी से इंटरैक्ट करने की अनुमति देता है। कई Django-आधारित एप्लिकेशन डेटा मॉडलिंग और बुनियादी प्रश्नों के लिए Django ORM का उपयोग करते हैं, हालांकि, अधिक जटिल कार्यों के लिए, डेवलपर्स आमतौर पर SQLAlchemy का उपयोग करते हैं।
निष्कर्ष
इस ट्यूटोरियल में, हमने आपके पायथन एप्लिकेशन में एक MySQL डेटाबेस को एकीकृत करने का तरीका देखा। हमने MySQL डेटाबेस का एक परीक्षण नमूना भी विकसित किया और इसके साथ सीधे पायथन कोड से बातचीत की। पायथन में अन्य डीबीएमएस जैसे मोंगोडीबी और पोस्टग्रेएसक्यूएल के लिए कनेक्टर हैं। हमें यह जानकर खुशी होगी कि पायथन और डेटाबेस पर आपकी कौन सी अन्य सामग्री में रुचि होगी।
इस लेख में दिखाया गया मीडिया एनालिटिक्स विद्या के स्वामित्व में नहीं है और लेखक के विवेक पर उपयोग किया जाता है।
सम्बंधित
- '
- "
- 100
- 11
- 2016
- 2019
- 7
- 9
- पहुँच
- लेखा
- कार्य
- सक्रिय
- अतिरिक्त
- साहसिक
- वायु सेना
- सब
- की अनुमति दे
- विश्लेषण
- विश्लेषिकी
- एनीमेशन
- आवेदन
- अनुप्रयोगों
- तर्क
- लेख
- आक्रमण
- BEST
- काली
- मुक्केबाज़ी
- बॉक्स ऑफिस
- कॉल
- कौन
- कुश्ती
- चुनौती
- परिवर्तन
- बच्चा
- कोड
- स्तंभ
- कॉमेडी
- वाणिज्यिक
- संचार
- समुदाय
- अंग
- भ्रम
- कनेक्शन
- युगल
- बनाना
- साख
- अपराध
- तिथि
- डेटा विश्लेषण
- आँकड़ा प्रबंधन
- डाटाबेस
- डेटाबेस
- खजूर
- मृत
- विस्तार
- विकसित करना
- डेवलपर्स
- Django
- डाक में काम करनेवाला मज़दूर
- डॉलर
- नाटक
- ड्राइवर
- बूंद
- वातावरण
- अनुमान
- आदि
- निष्पादन
- फास्ट
- Feature
- विशेषताएं
- फीस
- कल्पना
- आकृति
- फ़िल्म
- फिल्मों
- अंत में
- प्रथम
- प्रपत्र
- प्रारूप
- ढांचा
- समारोह
- सामान्य जानकारी
- अच्छा
- गूगल
- पकड़ लेना
- समूह
- गाइड
- हैकर
- हैकर्स
- हैंडलिंग
- सुविधाजनक
- यहाँ उत्पन्न करें
- छिपाना
- होम
- कैसे
- How To
- HTTPS
- सहित
- करें-
- बातचीत
- अलगाव
- IT
- काम
- में शामिल होने
- कुंजी
- Instagram पर
- राजा
- ज्ञान
- भाषा
- भाषाऐं
- बड़ा
- नेतृत्व
- जानें
- पुस्तकालय
- सीमित
- LINK
- लिंक्डइन
- लिनक्स
- सूची
- MacOS
- प्रमुख
- निर्माण
- प्रबंध
- जोड़ - तोड़
- बाजार
- बाजार का नेता
- सामग्री
- मीडिया
- दस लाख
- MongoDB
- सबसे लोकप्रिय
- चलचित्र
- चलचित्र
- नामों
- नेटफ्लिक्स
- ऑफर
- सरकारी
- ओफ़्सेट
- खुला
- ओपन-सोर्स कोड
- परिचालन
- ऑपरेटिंग सिस्टम
- ऑपरेटिंग सिस्टम
- संचालन
- पेशीनगोई
- आदेश
- अन्य
- मिसाल
- पासवर्ड
- स्टाफ़
- प्रदर्शन
- लोकप्रिय
- कार्यक्रम
- प्रोग्रामिंग
- प्रोग्रामिंग की भाषाएँ
- परियोजना
- संपत्ति
- अजगर
- रेंज
- रेटिंग
- कारण
- अभिलेख
- रिश्ते
- उपयुक्त संसाधन चुनें
- परिणाम
- रिटर्न
- की समीक्षा
- समीक्षा
- जोखिम
- रोल
- रन
- दौड़ना
- विज्ञान
- सुरक्षा
- सेट
- की स्थापना
- सरल
- छोटा
- So
- सॉफ्टवेयर
- सोलारिस
- समाधान ढूंढे
- अंतरिक्ष
- खेल
- एसक्यूएल
- SQL इंजेक्शन
- मानकों
- प्रारंभ
- शुरू
- कथन
- भंडारण
- सफलता
- धूप
- परिशिष्ट
- समर्थन
- प्रणाली
- सिस्टम
- लक्ष्य
- तकनीक
- परीक्षण
- पहर
- खिलौना
- ट्रांजेक्शन
- लेनदेन
- ट्यूटोरियल
- अपडेट
- us
- उपयोगकर्ताओं
- मूल्य
- देखें
- वास्तविक
- चपेट में
- युद्ध
- वेब
- कौन
- खिड़कियां
- अंदर
- काम
- कार्य
- वर्ष