Python 3 - การเข้าถึงฐานข้อมูล MySQL
มาตรฐาน Python สำหรับอินเทอร์เฟซฐานข้อมูลคือ Python DB-API อินเทอร์เฟซฐานข้อมูล Python ส่วนใหญ่เป็นไปตามมาตรฐานนี้
คุณสามารถเลือกฐานข้อมูลที่เหมาะสมสำหรับแอปพลิเคชันของคุณ Python Database API รองรับเซิร์ฟเวอร์ฐานข้อมูลที่หลากหลายเช่น -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
นี่คือรายการสินค้าจากอินเตอร์เฟซฐานข้อมูลหลาม - งูหลามการเชื่อมต่อฐานข้อมูลและ API คุณต้องดาวน์โหลดโมดูล DB API แยกต่างหากสำหรับแต่ละฐานข้อมูลที่คุณต้องการเข้าถึง ตัวอย่างเช่นหากคุณต้องการเข้าถึงฐานข้อมูล Oracle และฐานข้อมูล MySQL คุณต้องดาวน์โหลดทั้งโมดูลฐานข้อมูล Oracle และ MySQL
DB API มีมาตรฐานขั้นต่ำสำหรับการทำงานกับฐานข้อมูลโดยใช้โครงสร้าง Python และไวยากรณ์ทุกที่ที่ทำได้ API นี้มีดังต่อไปนี้ -
- การนำเข้าโมดูล API
- รับการเชื่อมต่อกับฐานข้อมูล
- การออกคำสั่ง SQL และกระบวนงานที่เก็บไว้
- กำลังปิดการเชื่อมต่อ
Python มีการรองรับ SQLite ในตัว ในส่วนนี้เราจะเรียนรู้แนวคิดทั้งหมดโดยใช้ MySQL โมดูล MySQLdb ซึ่งเป็นอินเทอร์เฟซยอดนิยมกับ MySQL ไม่สามารถทำงานร่วมกับ Python 3 ได้เราจะใช้โมดูลPyMySQLแทน
PyMySQL คืออะไร?
PyMySQL เป็นอินเทอร์เฟซสำหรับเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูล MySQL จาก Python ใช้ Python Database API v2.0 และมีไลบรารีไคลเอนต์ Pure-Python MySQL เป้าหมายของ PyMySQL คือการแทนที่ MySQLdb แบบดรอปอิน
ฉันจะติดตั้ง PyMySQL ได้อย่างไร
ก่อนดำเนินการต่อคุณต้องแน่ใจว่าคุณได้ติดตั้ง PyMySQL บนเครื่องของคุณแล้ว เพียงพิมพ์สิ่งต่อไปนี้ในสคริปต์ Python ของคุณและดำเนินการ -
#!/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 -
pip install pymysql
อีกทางเลือกหนึ่ง (เช่นหากไม่มี pip) สามารถดาวน์โหลด tarball ได้จากGitHubและติดตั้งด้วย Setuptools ดังนี้ -
$ # 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 - ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ root ในการติดตั้งโมดูลด้านบน
การเชื่อมต่อฐานข้อมูล
ก่อนเชื่อมต่อกับฐานข้อมูล MySQL โปรดตรวจสอบประเด็นต่อไปนี้ -
คุณได้สร้างฐานข้อมูล TESTDB
คุณได้สร้างตาราง EMPLOYEE ใน TESTDB
ตารางนี้มีฟิลด์ FIRST_NAME, LAST_NAME, AGE, SEX และ INCOME
ID ผู้ใช้ "testuser" และรหัสผ่าน "test123" ถูกตั้งค่าให้เข้าถึง TESTDB
โมดูล Python PyMySQL ได้รับการติดตั้งอย่างถูกต้องบนเครื่องของคุณ
คุณได้อ่านบทช่วยสอน MySQL เพื่อทำความเข้าใจเกี่ยวกับ MySQL Basics
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการเชื่อมต่อกับฐานข้อมูล 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
หากสร้างการเชื่อมต่อกับแหล่งข้อมูลแล้ว Connection Object จะถูกส่งคืนและบันทึกลงใน db สำหรับการใช้งานต่อไปมิฉะนั้น dbถูกตั้งค่าเป็นไม่มี ต่อไป,db วัตถุถูกใช้เพื่อสร้างไฟล์ cursorซึ่งจะใช้ในการดำเนินการแบบสอบถาม SQL สุดท้ายก่อนที่จะออกมาตรวจสอบให้แน่ใจว่าการเชื่อมต่อฐานข้อมูลถูกปิดและปล่อยทรัพยากร
การสร้างตารางฐานข้อมูล
เมื่อสร้างการเชื่อมต่อฐานข้อมูลแล้วเราก็พร้อมที่จะสร้างตารางหรือบันทึกลงในตารางฐานข้อมูลโดยใช้ execute วิธีการของเคอร์เซอร์ที่สร้างขึ้น
ตัวอย่าง
ให้เราสร้างตารางฐานข้อมูลพนักงาน -
#!/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 Operation เมื่อคุณต้องการสร้างระเบียนของคุณลงในตารางฐานข้อมูล
ตัวอย่าง
ตัวอย่างต่อไปนี้รันคำสั่งSQL INSERTเพื่อสร้างเรกคอร์ดในตาราง 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 = """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))
..................................
อ่านการทำงาน
READ Operation บนฐานข้อมูลใด ๆ หมายถึงการดึงข้อมูลที่เป็นประโยชน์จากฐานข้อมูล
เมื่อสร้างการเชื่อมต่อฐานข้อมูลแล้วคุณก็พร้อมที่จะทำการสืบค้นในฐานข้อมูลนี้ คุณสามารถใช้อย่างใดอย่างหนึ่งfetchone() วิธีการดึงข้อมูลระเบียนเดียวหรือ fetchall() วิธีการดึงหลายค่าจากตารางฐานข้อมูล
fetchone()- ดึงข้อมูลแถวถัดไปของชุดผลการค้นหา ชุดผลลัพธ์คือวัตถุที่ส่งคืนเมื่อวัตถุเคอร์เซอร์ถูกใช้เพื่อสอบถามตาราง
fetchall()- ดึงข้อมูลแถวทั้งหมดในชุดผลลัพธ์ หากมีการแยกแถวออกจากชุดผลลัพธ์แล้วระบบจะดึงข้อมูลแถวที่เหลือจากชุดผลลัพธ์
rowcount - นี่เป็นแอตทริบิวต์แบบอ่านอย่างเดียวและส่งกลับจำนวนแถวที่ได้รับผลกระทบจากเมธอด execute ()
ตัวอย่าง
ขั้นตอนต่อไปนี้สอบถามบันทึกทั้งหมดจากตารางพนักงานที่มีเงินเดือนมากกว่า 1,000 -
#!/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
อัปเดตการทำงาน
UPDATE การทำงานบนฐานข้อมูลหมายถึงการอัปเดตระเบียนตั้งแต่หนึ่งรายการขึ้นไปซึ่งมีอยู่แล้วในฐานข้อมูล
ขั้นตอนต่อไปนี้จะอัปเดตระเบียนทั้งหมดที่มี 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 เมื่อคุณต้องการลบบางระเบียนออกจากฐานข้อมูลของคุณ ต่อไปนี้เป็นขั้นตอนในการลบบันทึกทั้งหมดจาก 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 - เมื่อมีการทำธุรกรรมแล้วผลกระทบจะคงอยู่แม้ระบบจะล้มเหลวก็ตาม
Python DB API 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 คือการดำเนินการซึ่งให้สัญญาณสีเขียวไปยังฐานข้อมูลเพื่อทำการเปลี่ยนแปลงให้เสร็จสิ้นและหลังจากการดำเนินการนี้จะไม่มีการเปลี่ยนกลับ
นี่คือตัวอย่างง่ายๆในการเรียกไฟล์ commit วิธี.
db.commit()
การทำงานของ ROLLBACK
หากคุณไม่พอใจกับการเปลี่ยนแปลงอย่างน้อยหนึ่งรายการและต้องการเปลี่ยนกลับการเปลี่ยนแปลงเหล่านั้นอย่างสมบูรณ์ให้ใช้ไฟล์ rollback() วิธี.
นี่คือตัวอย่างง่ายๆในการเรียกไฟล์ rollback() วิธี.
db.rollback()
กำลังยกเลิกการเชื่อมต่อฐานข้อมูล
ในการยกเลิกการเชื่อมต่อฐานข้อมูลให้ใช้เมธอด close ()
db.close()
หากการเชื่อมต่อกับฐานข้อมูลถูกปิดโดยผู้ใช้ด้วยเมธอด close () ธุรกรรมที่ค้างอยู่จะถูกย้อนกลับโดย DB อย่างไรก็ตามแทนที่จะขึ้นอยู่กับรายละเอียดการใช้งาน DB ในระดับที่ต่ำกว่าแอปพลิเคชันของคุณจะดีกว่าหากเรียกคอมมิตหรือย้อนกลับอย่างชัดเจน
การจัดการข้อผิดพลาด
มีหลายแหล่งที่มาของข้อผิดพลาด ตัวอย่างบางส่วน ได้แก่ ข้อผิดพลาดทางไวยากรณ์ในคำสั่ง SQL ที่เรียกใช้งานความล้มเหลวในการเชื่อมต่อหรือการเรียกวิธีการดึงข้อมูลสำหรับหมายเลขอ้างอิงคำสั่งที่ยกเลิกไปแล้ว
DB API กำหนดข้อผิดพลาดจำนวนหนึ่งที่ต้องมีอยู่ในแต่ละโมดูลฐานข้อมูล ตารางต่อไปนี้แสดงรายการข้อยกเว้นเหล่านี้
ซีเนียร์ | ข้อยกเว้นและคำอธิบาย |
---|---|
1 | Warning ใช้สำหรับปัญหาที่ไม่ร้ายแรง ต้องมีคลาสย่อย StandardError |
2 | Error คลาสพื้นฐานสำหรับข้อผิดพลาด ต้องมีคลาสย่อย StandardError |
3 | InterfaceError ใช้สำหรับข้อผิดพลาดในโมดูลฐานข้อมูลไม่ใช่ตัวฐานข้อมูล ต้องมีข้อผิดพลาดคลาสย่อย |
4 | DatabaseError ใช้สำหรับข้อผิดพลาดในฐานข้อมูล ต้องมีข้อผิดพลาดคลาสย่อย |
5 | DataError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดในข้อมูล |
6 | OperationalError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดเช่นการสูญเสียการเชื่อมต่อกับฐานข้อมูล โดยทั่วไปข้อผิดพลาดเหล่านี้อยู่นอกการควบคุมของ Python scripter |
7 | IntegrityError คลาสย่อยของ DatabaseError สำหรับสถานการณ์ที่จะทำลายความสมบูรณ์เชิงสัมพันธ์เช่นข้อ จำกัด เฉพาะหรือคีย์ต่างประเทศ |
8 | InternalError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดภายในโมดูลฐานข้อมูลเช่นเคอร์เซอร์ไม่ทำงานอีกต่อไป |
9 | ProgrammingError คลาสย่อยของ DatabaseError ที่อ้างถึงข้อผิดพลาดเช่นชื่อตารางที่ไม่ถูกต้องและสิ่งอื่น ๆ ที่สามารถตำหนิคุณได้อย่างปลอดภัย |
10 | NotSupportedError คลาสย่อยของ DatabaseError ที่อ้างถึงการพยายามเรียกใช้ฟังก์ชันที่ไม่รองรับ |
สคริปต์ Python ของคุณควรจัดการกับข้อผิดพลาดเหล่านี้ แต่ก่อนที่จะใช้ข้อยกเว้นใด ๆ ข้างต้นตรวจสอบให้แน่ใจว่า MySQLdb ของคุณรองรับข้อยกเว้นนั้น คุณสามารถรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ได้โดยอ่านข้อกำหนด DB API 2.0