पायथन को डेटाबेस से क्यों जोड़ें?
पायथन तर्क और उपयोगकर्ता स्क्रीन में अच्छा है; 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')- connect() एक कनेक्शन ऑब्जेक्ट देता है। आर्ग्युमेंट:
host(सर्वर, अक्सर 'localhost'),user,passwd/password,database। is_connected()कनेक्शन ठीक हो तो True देता है।- cursor() कनेक्शन से कर्सर ऑब्जेक्ट बनाता है। यह क्वेरी चलाता है और परिणाम रखता है।
- execute(query) एक SQL स्टेटमेंट स्ट्रिंग के रूप में भेजता है।
परिणाम पढ़ना: fetchone, fetchall, fetchmany, rowcount
SELECT के बाद पंक्तियाँ कर्सर के रिज़ल्ट सेट में इंतज़ार करती हैं। हर पंक्ति एक ट्यूपल बनकर आती है।
fetchone(): अगली एक पंक्ति ट्यूपल में, या कुछ न बचे तोNone।fetchall(): बची सब पंक्तियाँ ट्यूपल की लिस्ट में (कुछ न बचे तो ख़ाली लिस्ट)।fetchmany(n): अगली n पंक्तियाँ लिस्ट में।rowcount: एक गुण (कोष्ठक नहीं)। SELECT में अब तक ली गई पंक्तियाँ; INSERT/UPDATE/DELETE में प्रभावित पंक्तियाँ।
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 क्या लौटाएँगे।
मुख्य सूत्र और परिभाषाएँ
- con = mysql.connector.connect(host, user, passwd, database) → cur = con.cursor()
- cur.execute(sql[, params]) · INSERT/UPDATE/DELETE के बाद con.commit()
- fetchone() → ट्यूपल या None · fetchall() → ट्यूपल की लिस्ट · fetchmany(n) · cur.rowcount
- execute('… %s …', (value,)) · या '… {} …'.format(value)
हल किए गए उदाहरण
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()।
आम गलतियाँ
- INSERT, UPDATE या DELETE के बाद con.commit() भूलना, जिससे कुछ सहेजा नहीं जाता।
- cur.commit() लिखना; commit() कनेक्शन ऑब्जेक्ट का है।
- एक मान (80,) की जगह (80) भेजना; ट्यूपल होना चाहिए।
- rowcount() कोष्ठक के साथ लिखना; यह गुण है: cur.rowcount।