पायथन 3 - MySQL डाटाबेस एक्सेस

डेटाबेस इंटरफेस के लिए पायथन मानक पायथन डीबी-एपीआई है। अधिकांश पायथन डेटाबेस इंटरफेस इस मानक का पालन करते हैं।

आप अपने आवेदन के लिए सही डेटाबेस चुन सकते हैं। अजगर डेटाबेस एपीआई डेटाबेस सर्वर की एक विस्तृत श्रृंखला का समर्थन करता है जैसे -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

यहाँ उपलब्ध पायथन डेटाबेस इंटरफेस की सूची दी गई है - पायथन डेटाबेस इंटरफेस और एपीआई । आपके द्वारा उपयोग किए जाने वाले प्रत्येक डेटाबेस के लिए आपको एक अलग DB एपीआई मॉड्यूल डाउनलोड करना होगा। उदाहरण के लिए, यदि आपको ओरेकल डेटाबेस के साथ-साथ MySQL डेटाबेस तक पहुँचने की आवश्यकता है, तो आपको Oracle और MySQL डेटाबेस मॉड्यूल दोनों को डाउनलोड करना होगा।

डीबी एपीआई जहां संभव हो पायथन संरचनाओं और सिंटैक्स का उपयोग कर डेटाबेस के साथ काम करने के लिए एक न्यूनतम मानक प्रदान करता है। इस एपीआई में निम्नलिखित शामिल हैं -

  • एपीआई मॉड्यूल आयात करना।
  • डेटाबेस के साथ एक कनेक्शन प्राप्त करना।
  • SQL कथन और संग्रहीत कार्यविधियाँ जारी करना।
  • कनेक्शन बंद करना

पायथन में SQLite के लिए एक अंतर्निहित समर्थन है। इस खंड में, हम MySQL का उपयोग करके सभी अवधारणाओं को सीखेंगे। MySQLdb मॉड्यूल, MySQL के साथ एक लोकप्रिय इंटरफ़ेस पायथन 3 के साथ संगत नहीं है। इसके बजाय, हम PyMySQL मॉड्यूल का उपयोग करेंगे ।

PyMySQL क्या है?

PyMySQL Python से MySQL डेटाबेस सर्वर से कनेक्ट करने के लिए एक इंटरफ़ेस है। यह Python Database API v2.0 को लागू करता है और इसमें एक शुद्ध-Python MySQL क्लाइंट लाइब्रेरी होती है। PyMySQL का लक्ष्य MySQLdb के लिए एक ड्रॉप-इन प्रतिस्थापन है।

मैं PyMySQL कैसे स्थापित करूं?

आगे बढ़ने से पहले, आप सुनिश्चित करें कि आपके पास अपनी मशीन पर PyMySQL स्थापित है। बस अपनी पायथन लिपि में निम्नलिखित टाइप करें और इसे निष्पादित करें -

#!/usr/bin/python3

import pymysql

यदि यह निम्नलिखित परिणाम उत्पन्न करता है, तो इसका मतलब है कि MySQLdb मॉड्यूल स्थापित नहीं है -

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      Import pymysql
ImportError: No module named pymysql

अंतिम स्थिर रिलीज PyPI पर उपलब्ध है और इसे पाइप के साथ स्थापित किया जा सकता है -

pip install pymysql

वैकल्पिक रूप से (उदाहरण के लिए यदि पाइप उपलब्ध नहीं है), एक टारबॉल GitHub से डाउनलोड किया जा सकता है और सेटप्टूल के साथ निम्नानुसार स्थापित किया जा सकता है -

$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python setup.py install
$ # The folder PyMySQL* can be safely removed now.

Note - सुनिश्चित करें कि आपके पास उपरोक्त मॉड्यूल को स्थापित करने के लिए रूट विशेषाधिकार हैं।

डेटाबेस कनेक्शन

MySQL डेटाबेस से कनेक्ट करने से पहले, निम्नलिखित बातों का ध्यान रखें -

  • आपने एक डेटाबेस बनाया है TESTDB।

  • आपने TESTDB में एक टेबल EMPLOYEE बनाया है।

  • इस तालिका में FIRST_NAME, LAST_NAME, AGE, SEX और INCOME हैं।

  • उपयोगकर्ता ID "testuser" और पासवर्ड "test123" TESTDB तक पहुँचने के लिए निर्धारित हैं।

  • Python मॉड्यूल PyMySQL आपकी मशीन पर ठीक से स्थापित है।

  • आप MySQL बेसिक्स को समझने के लिए MySQL ट्यूटोरियल से गुजरे हैं।

उदाहरण

निम्नलिखित MySQL डेटाबेस "TESTDB" से जुड़ने का एक उदाहरण है -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print ("Database version : %s " % data)

# disconnect from server
db.close()

इस लिपि को चलाते समय, यह निम्नलिखित परिणाम उत्पन्न करता है।

Database version : 5.5.20-log

यदि कोई कनेक्शन डेटा स्रोत के साथ स्थापित किया गया है, तो एक कनेक्शन ऑब्जेक्ट वापस किया जाता है और इसमें सहेजा जाता है db आगे के उपयोग के लिए, अन्यथा dbकोई भी सेट नहीं है। आगे,db ऑब्जेक्ट का उपयोग a बनाने के लिए किया जाता है cursorऑब्जेक्ट, जो बदले में SQL प्रश्नों को निष्पादित करने के लिए उपयोग किया जाता है। अंत में, बाहर आने से पहले, यह सुनिश्चित करता है कि डेटाबेस कनेक्शन बंद है और संसाधन जारी किए गए हैं।

डेटाबेस तालिका बनाना

डेटाबेस कनेक्शन स्थापित होने के बाद, हम डेटाबेस तालिकाओं में तालिकाओं या रिकॉर्ड बनाने के लिए तैयार हैं execute निर्मित कर्सर की विधि।

उदाहरण

आइए हम एक डेटाबेस तालिका EMPLOYEE बनाएं -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
   FIRST_NAME  CHAR(20) NOT NULL,
   LAST_NAME  CHAR(20),
   AGE INT,  
   SEX CHAR(1),
   INCOME FLOAT )"""

cursor.execute(sql)

# disconnect from server
db.close()

INSERT ऑपरेशन

जब आप अपने रिकॉर्ड को डेटाबेस तालिका में बनाना चाहते हैं, तो INSERT ऑपरेशन आवश्यक है।

उदाहरण

निम्न उदाहरण, EMPLOYEE तालिका में रिकॉर्ड बनाने के लिए SQL INSERT विवरण निष्पादित करता है -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
   LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

उपरोक्त उदाहरण गतिशील रूप से SQL क्वेरी बनाने के लिए निम्नानुसार लिखे जा सकते हैं -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
   LAST_NAME, AGE, SEX, INCOME) \
   VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
   ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

उदाहरण

निम्नलिखित कोड खंड निष्पादन का एक और रूप है जहां आप सीधे मापदंडों को पारित कर सकते हैं -

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

पढ़ें ऑपरेशन

किसी भी डेटाबेस पर पढ़ें ऑपरेशन का मतलब डेटाबेस से कुछ उपयोगी जानकारी प्राप्त करना है।

एक बार डेटाबेस कनेक्शन स्थापित हो जाने के बाद, आप इस डेटाबेस में एक प्रश्न बनाने के लिए तैयार हैं। आप या तो उपयोग कर सकते हैंfetchone() एकल रिकॉर्ड या लाने के लिए विधि fetchall() एक डेटाबेस तालिका से कई मान लाने की विधि।

  • fetchone()- यह एक क्वेरी परिणाम सेट की अगली पंक्ति लाती है। एक परिणाम सेट एक ऑब्जेक्ट है जो एक टेबल को क्वेरी करने के लिए कर्सर ऑब्जेक्ट का उपयोग करने पर वापस किया जाता है।

  • fetchall()- यह एक परिणाम सेट में सभी पंक्तियों को लाता है। यदि परिणाम सेट से कुछ पंक्तियों को पहले ही निकाला जा चुका है, तो यह परिणाम पंक्ति से शेष पंक्तियों को पुनः प्राप्त करता है।

  • rowcount - यह केवल पढ़ने के लिए विशेषता है और उन पंक्तियों की संख्या लौटाता है जो एक निष्पादन () विधि से प्रभावित थे।

उदाहरण

निम्नलिखित प्रक्रिया 1000 से अधिक वेतन वाले EMPLOYEE तालिका के सभी रिकॉर्डों पर सवाल उठाती है -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
      WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print ("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \
         (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")

# disconnect from server
db.close()

उत्पादन

यह निम्नलिखित परिणाम का उत्पादन करेगा -

fname = Mac, lname = Mohan, age = 20, sex = M, income = 2000

अद्यतन अद्यतन

किसी भी डेटाबेस पर अद्यतन ऑपरेशन का मतलब एक या एक से अधिक रिकॉर्ड को अद्यतन करना है, जो पहले से ही डेटाबेस में उपलब्ध हैं।

निम्न प्रक्रिया SEX वाले सभी रिकॉर्ड को अपडेट करती है 'M'। यहां, हम सभी पुरुषों के एजीई को एक वर्ष तक बढ़ाते हैं।

उदाहरण

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

DELETE ऑपरेशन

DELETE ऑपरेशन की आवश्यकता तब होती है जब आप अपने डेटाबेस से कुछ रिकॉर्ड हटाना चाहते हैं। EMPLOYEE से सभी रिकॉर्ड को हटाने की प्रक्रिया निम्नलिखित है जहाँ AGE 20 से अधिक है -

उदाहरण

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

लेन-देन करना

लेन-देन एक तंत्र है जो डेटा स्थिरता सुनिश्चित करता है। लेन-देन के निम्नलिखित चार गुण हैं -

  • Atomicity - या तो लेनदेन पूरा हो जाता है या कुछ भी नहीं होता है।

  • Consistency - लेन-देन सुसंगत अवस्था में शुरू होना चाहिए और सिस्टम को सुसंगत अवस्था में छोड़ना चाहिए।

  • Isolation - लेन-देन के मध्यवर्ती परिणाम वर्तमान लेनदेन के बाहर दिखाई नहीं देते हैं।

  • Durability - एक बार लेनदेन करने के बाद, सिस्टम की विफलता के बाद भी प्रभाव लगातार बना रहता है।

अजगर डीबी एपीआई 2.0 या तो करने के लिए दो तरीके प्रदान करने या रोलबैक एक सौदे।

उदाहरण

आप पहले से ही जानते हैं कि लेनदेन को कैसे लागू किया जाए। यहाँ एक समान उदाहरण है -

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

COMMIT ऑपरेशन

कमिट एक ऑपरेशन है, जो बदलावों को अंतिम रूप देने के लिए डेटाबेस को हरी झंडी देता है और इस ऑपरेशन के बाद कोई भी बदलाव वापस नहीं किया जा सकता है।

यहां कॉल करने के लिए एक सरल उदाहरण है commit तरीका।

db.commit()

रोलबैक ऑपरेशन

यदि आप एक या अधिक परिवर्तनों से संतुष्ट नहीं हैं और आप उन परिवर्तनों को पूरी तरह से वापस लेना चाहते हैं, तो उपयोग करें rollback() तरीका।

यहां कॉल करने के लिए एक सरल उदाहरण है rollback() तरीका।

db.rollback()

डेटाबेस को डिस्कनेक्ट कर रहा है

डेटाबेस कनेक्शन को डिस्कनेक्ट करने के लिए, बंद () विधि का उपयोग करें।

db.close()

यदि किसी डेटाबेस का कनेक्शन उपयोगकर्ता द्वारा बंद () विधि के साथ बंद किया जाता है, तो किसी भी बकाया लेनदेन को DB द्वारा वापस रोल किया जाता है। हालांकि, डीबी निचले स्तर के कार्यान्वयन के किसी भी विवरण पर निर्भर करने के बजाय, आपका आवेदन कॉलिंग कमिट या रोलबैक से स्पष्ट रूप से बेहतर होगा।

त्रुटियों को संभालना

त्रुटियों के कई स्रोत हैं। कुछ उदाहरण एक निष्पादित SQL स्टेटमेंट, एक कनेक्शन विफलता, या पहले से रद्द किए गए स्टेटमेंट हैंडल के लिए भ्रूण विधि को कॉल करने में एक सिंटैक्स त्रुटि है।

डीबी एपीआई कई त्रुटियों को परिभाषित करता है जो प्रत्येक डेटाबेस मॉड्यूल में मौजूद होना चाहिए। निम्न तालिका इन अपवादों को सूचीबद्ध करती है।

अनु क्रमांक। अपवाद और विवरण
1

Warning

गैर-घातक मुद्दों के लिए उपयोग किया जाता है। सबक्लेयर को पूरा करें।

2

Error

त्रुटियों के लिए आधार वर्ग। सबक्लेयर को पूरा करें।

3

InterfaceError

डेटाबेस मॉड्यूल में त्रुटियों के लिए उपयोग किया जाता है, डेटाबेस ही नहीं। उपवर्ग त्रुटि।

4

DatabaseError

डेटाबेस में त्रुटियों के लिए उपयोग किया जाता है। उपवर्ग त्रुटि।

5

DataError

DatabaseError का उपवर्ग जो डेटा में त्रुटियों को संदर्भित करता है।

6

OperationalError

DatabaseError का उपवर्ग जो डेटाबेस से कनेक्शन के नुकसान जैसी त्रुटियों को संदर्भित करता है। ये त्रुटियां आमतौर पर पायथन ट्रॉटर के नियंत्रण से बाहर होती हैं।

7

IntegrityError

उन डेटाबेस के लिए उपश्रम की स्थिति, जो विशिष्टता अखंडता को नुकसान पहुंचाएंगे, जैसे कि विशिष्टता की कमी या विदेशी कुंजी।

8

InternalError

DatabaseError का उपवर्ग जो डेटाबेस मॉड्यूल में आंतरिक त्रुटियों को संदर्भित करता है, जैसे कि कर्सर अब सक्रिय नहीं है।

9

ProgrammingError

DatabaseError का उपवर्ग जो एक खराब तालिका नाम और अन्य चीजों के रूप में त्रुटियों को संदर्भित करता है जिन्हें सुरक्षित रूप से आप पर दोष दिया जा सकता है।

10

NotSupportedError

DatabaseError का उपवर्ग जो असमर्थित कार्यक्षमता को कॉल करने का प्रयास करता है।

आपकी पायथन लिपियों को इन त्रुटियों को संभालना चाहिए, लेकिन उपरोक्त अपवादों में से किसी का उपयोग करने से पहले, सुनिश्चित करें कि आपके MySQLdb के पास उस अपवाद के लिए समर्थन है। आप DB API 2.0 विनिर्देश पढ़कर उनके बारे में अधिक जानकारी प्राप्त कर सकते हैं।