📘 CodingMarble Learn

पायथन को MySQL से जोड़ना: SQL भेजो, पंक्तियाँ पाओ

पायथन mysql.connector मॉड्यूल से MySQL डेटाबेस से बात कर सकता है। connect() host, user, password और database से कनेक्शन खोलता है। cursor() कर्सर बनाता है, वह ऑब्जेक्ट जो SQL डेटाबेस तक ले जाता है और परिणाम वापस लाता है। execute() एक SQL स्टेटमेंट चलाता है। INSERT, UPDATE और DELETE के बाद बदलाव सहेजने को कनेक्शन पर commit() ज़रूरी है। SELECT के लिए fetchone() अगली पंक्ति ट्यूपल में देता है, fetchall() बची सब पंक्तियाँ ट्यूपल की लिस्ट में, और rowcount बताता है कितनी पंक्तियाँ लीं या बदलीं। क्वेरी में मान %s प्लेसहोल्डर (execute को ट्यूपल देकर) या format() से डालते हैं।

🎬 कदम-दर-कदम कहानी

  1. import mysql.connector, फिर connect() पायथन से MySQL सर्वर तक पुल बनाता है: host, user, password, database से।
  2. cursor() पुल पर एक छोटी गाड़ी रखता है। कर्सर आपका SQL डेटाबेस तक ले जाता है और पंक्तियाँ वापस लाता है।
  3. execute('SELECT …') क्वेरी भेजता है। पंक्तियाँ कर्सर में इंतज़ार करती हैं। fetchone() एक पंक्ति लेता है; fetchall() बाकी सब; rowcount अब तक ली गई पंक्तियाँ गिनता है।
  4. execute('INSERT …') तालिका अभी के लिए बदलता है। commit() उसे पक्का सहेजता है। commit के बिना बंद करते ही बदलाव खो जाता है।
  5. क्वेरी में मान %s से सुरक्षित डालिए: execute('… WHERE Marks > %s', (80,))। या format() से स्ट्रिंग बनाइए। अंत में कर्सर और कनेक्शन बंद कीजिए।
  6. आपकी बारी: fetchone और fetchall दबाइए। पंक्तियों को कर्सर से निकलते और rowcount बदलते देखिए।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

mysql.connector के लिए MySQL इंस्टॉल होना ज़रूरी है?

हाँ, MySQL सर्वर चलता होना चाहिए (आपके या दूसरे कंप्यूटर पर), और कनेक्टर मॉड्यूल pip से इंस्टॉल हो।

कर्सर असल में क्या है?

एक ऑब्जेक्ट जो SQL डेटाबेस तक ले जाता है और लौटी पंक्तियाँ रखता है, ताकि आप उन्हें एक-एक या सब एक साथ ले सकें।

fetchall() ने ख़ाली लिस्ट क्यों दी?

पहले के fetch सब पंक्तियाँ ले चुके थे। हर execute के बाद हर पंक्ति एक ही बार ली जा सकती है।

मेरा INSERT चला पर पंक्ति तालिका में नहीं है। क्यों?

आपने con.commit() नहीं बुलाया। इसके बिना बदलाव फेंक दिया जाता है।

(80,) कॉमा के साथ क्यों?

execute को मानों का ट्यूपल चाहिए। (80) बस संख्या 80 है; (80,) एक आइटम वाला ट्यूपल।

पायथन को डेटाबेस से क्यों जोड़ें?

पायथन तर्क और उपयोगकर्ता स्क्रीन में अच्छा है; MySQL बहुत सारा डेटा सुरक्षित रखने और खोजने में। दोनों मिलकर: पायथन प्रोग्राम (फ़्रंट एंड) MySQL (बैक एंड) में डेटा रख और पढ़ सकता है।

कनेक्टर एक बार इंस्टॉल करें: pip install mysql-connector-python। फिर:

import mysql.connector as sql

कदम-दर-कदम: connect, cursor, execute

import mysql.connector as sql
con = sql.connect(host='localhost', user='root',
                  passwd='your_password', database='school')
if con.is_connected():
    print('Connected')
cur = con.cursor()
cur.execute('SELECT * FROM student')

परिणाम पढ़ना: fetchone, fetchall, fetchmany, rowcount

SELECT के बाद पंक्तियाँ कर्सर के रिज़ल्ट सेट में इंतज़ार करती हैं। हर पंक्ति एक ट्यूपल बनकर आती है।

cur.execute('SELECT RollNo, Name FROM student')
r = cur.fetchone()      # (1, 'Asha')
print(cur.rowcount)     # 1
rest = cur.fetchall()   # [(2,'Ravi'), (3,'Zoya')]
print(cur.rowcount)     # 3
for row in rest:
    print(row[0], row[1])

डेटा बदलना: INSERT, UPDATE, DELETE और commit()

cur.execute("INSERT INTO student VALUES (4, 'Om', 'Pune', 70)")
con.commit()
print(cur.rowcount, 'row inserted')

cur.execute('UPDATE student SET Marks = Marks + 2 WHERE Marks < 60')
con.commit()
print(cur.rowcount, 'rows updated')

commit() कनेक्शन का मेथड है (con.commit()), कर्सर का नहीं। यह बदलाव स्थायी बनाता है। इसके बिना प्रोग्राम ख़त्म होते ही बदलाव फेंक दिए जाते हैं। (con.rollback() बिना commit वाले बदलाव उलट देता है।) अंत में: cur.close() और con.close()।

क्वेरी में मान डालना: %s और format()

%s प्लेसहोल्डर (बेहतर तरीका)

roll = int(input('Roll: '))
cur.execute('SELECT * FROM student WHERE RollNo = %s', (roll,))
print(cur.fetchone())

cur.execute('INSERT INTO student VALUES (%s, %s, %s, %s)', (5, 'Kabir', 'Jaipur', 66))
con.commit()

मान दूसरे आर्ग्युमेंट में ट्यूपल बनकर जाते हैं। एक मान के साथ भी कॉमा चाहिए: (roll,)। कनेक्टर ज़रूरत पर उद्धरण चिह्न लगाता है और हानिकारक इनपुट (SQL इंजेक्शन) से बचाता है। संख्या के लिए भी %s ही लिखें।

format() या f-string से

q = "SELECT * FROM student WHERE Marks > {} AND City = '{}'".format(80, 'Delhi')
cur.execute(q)

यहाँ स्ट्रिंग पहले बनती है, इसलिए टेक्स्ट मानों के चारों ओर उद्धरण चिह्न ख़ुद लगाने होंगे। अभ्यास के लिए ठीक, पर असली इनपुट के लिए %s सुरक्षित है।

करके देखें: छोटा मेन्यू प्रोग्राम

मेन्यू बनाइए: 1 छात्र जोड़ें, 2 सब दिखाएँ, 3 रोल से खोजें, 4 बाहर। जोड़ने और खोजने में %s वाला execute, जोड़ने के बाद commit(), दिखाने में fetchall() और खोजने में fetchone()। परखिए: एक छात्र जोड़कर commit() भूल जाइए; प्रोग्राम फिर चलाकर देखिए वह ग़ायब है। फिर commit() जोड़कर दोबारा कीजिए। 3D के आख़िरी कदम में अनुमान लगाइए fetchone और fetchall क्या लौटाएँगे।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. localhost पर डेटाबेस 'library' से user 'root' और पासवर्ड 'abc' के साथ जुड़ने और जुड़ा है या नहीं छापने का कोड लिखिए।

import mysql.connector as sql con = sql.connect(host='localhost', user='root', passwd='abc', database='library') print(con.is_connected()) # True

2. student में 5 पंक्तियाँ हैं। cur.execute('SELECT * FROM student') के बाद कोड दो बार fetchone() और फिर fetchall() बुलाता है। fetchall() कितनी पंक्तियाँ देगा, और अंत में cur.rowcount?

दो fetchone() ने पंक्ति 1 और 2 लीं। fetchall() बची 3 पंक्तियाँ देगा। rowcount = 5 (अब तक ली गई सब)।

3. %s से 80 से ज़्यादा अंक वाले सब छात्र दिखाइए।

cur.execute('SELECT Name, Marks FROM student WHERE Marks > %s', (80,)) for name, marks in cur.fetchall(): print(name, marks)

4. उपयोगकर्ता के लिखे विवरण वाला छात्र जोड़कर सहेजिए।

r = int(input('Roll: ')); n = input('Name: '); c = input('City: '); m = int(input('Marks: ')) cur.execute('INSERT INTO student VALUES (%s, %s, %s, %s)', (r, n, c, m)) con.commit() print(cur.rowcount, 'record added')

5. यही खोज format() से: उपयोगकर्ता के लिखे शहर के छात्र दिखाइए।

city = input('City: ') q = "SELECT * FROM student WHERE City = '{}'".format(city) cur.execute(q) print(cur.fetchall()) # टेक्स्ट के लिए {} के चारों ओर उद्धरण चिह्न

6. प्रोग्राम cur.execute('DELETE FROM student WHERE Marks < 40') चलाकर बंद होता है, पर पंक्तियाँ तालिका में बनी रहती हैं। क्यों? ठीक कीजिए।

बदलाव commit नहीं हुआ। execute के बाद con.commit() जोड़ें, फिर बंद करें: con.commit(); cur.close(); con.close()।

आम गलतियाँ

अभ्यास क्विज़

1. कौन-सा मेथड कर्सर बनाता है?
2. कोई पंक्ति न बचे तो fetchone() क्या लौटाता है?
3. INSERT को स्थायी सहेजने के लिए क्या चाहिए?
4. fetchall() लौटाता है:
5. mysql.connector के लिए सही प्लेसहोल्डर कौन-सा है?

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

fetchone() और fetchall() में क्या अंतर है?

fetchone() अगली एक पंक्ति ट्यूपल में (या None) देता है। fetchall() बची सब पंक्तियाँ ट्यूपल की लिस्ट में देता है।

पायथन MySQL में commit() क्यों चाहिए?

commit() INSERT, UPDATE और DELETE के बदलाव स्थायी करता है। इसके बिना कनेक्शन बंद होते ही बदलाव खो जाते हैं।

पायथन MySQL में rowcount क्या है?

कर्सर का गुण जो SELECT में अब तक ली गई पंक्तियाँ, या INSERT, UPDATE, DELETE में प्रभावित पंक्तियाँ बताता है।

यह कहाँ पढ़ाया जाता है

सीबीएसई (भारत)कक्षा 12डेटाबेस प्रबंधन

पहले यह पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ