Python Data Persistence - โมดูล Sqlite3
ข้อเสียที่สำคัญอย่างหนึ่งของไฟล์ CSV, JSON, XML และอื่น ๆ คือไฟล์เหล่านี้ไม่มีประโยชน์มากนักสำหรับการเข้าถึงแบบสุ่มและการประมวลผลธุรกรรมเนื่องจากมีลักษณะที่ไม่มีโครงสร้างเป็นส่วนใหญ่ ดังนั้นการแก้ไขเนื้อหาจึงเป็นเรื่องยากมาก
ไฟล์แบบแบนเหล่านี้ไม่เหมาะสำหรับสภาพแวดล้อมไคลเอนต์เซิร์ฟเวอร์เนื่องจากไม่มีความสามารถในการประมวลผลแบบอะซิงโครนัส การใช้ไฟล์ข้อมูลที่ไม่มีโครงสร้างทำให้ข้อมูลซ้ำซ้อนและไม่สอดคล้องกัน
ปัญหาเหล่านี้สามารถเอาชนะได้โดยใช้ฐานข้อมูลเชิงสัมพันธ์ ฐานข้อมูลคือการรวบรวมข้อมูลที่จัดระเบียบเพื่อลบความซ้ำซ้อนและความไม่สอดคล้องกันและรักษาความสมบูรณ์ของข้อมูล แบบจำลองฐานข้อมูลเชิงสัมพันธ์เป็นที่นิยมอย่างมาก
แนวคิดพื้นฐานคือการจัดเรียงข้อมูลในตารางเอนทิตี (เรียกว่าความสัมพันธ์) โครงสร้างตารางเอนทิตีมีหนึ่งแอตทริบิวต์ที่มีค่าไม่ซ้ำกันสำหรับแต่ละแถว แอตทริบิวต์ดังกล่าวเรียกว่า'primary key'.
เมื่อคีย์หลักของตารางหนึ่งปรากฏในโครงสร้างของตารางอื่นจะเรียกว่า 'Foreign key'และนี่เป็นพื้นฐานของความสัมพันธ์ระหว่างทั้งสอง จากรุ่นนี้มีผลิตภัณฑ์ RDBMS ที่เป็นที่นิยมมากมายในปัจจุบัน -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
SQLite เป็นฐานข้อมูลเชิงสัมพันธ์ที่มีน้ำหนักเบาซึ่งใช้ในแอปพลิเคชันที่หลากหลาย มันเป็นเอ็นจิ้นฐานข้อมูล SQL ที่มีการทำธุรกรรมในตัวไม่มีเซิร์ฟเวอร์ไม่มีเซิร์ฟเวอร์ ฐานข้อมูลทั้งหมดเป็นไฟล์เดียวซึ่งสามารถวางไว้ที่ใดก็ได้ในระบบไฟล์ เป็นซอฟต์แวร์โอเพ่นซอร์สที่มีขนาดเล็กมากและไม่มีการกำหนดค่า เป็นที่นิยมใช้ในอุปกรณ์ฝังตัว IOT และแอพมือถือ
ฐานข้อมูลเชิงสัมพันธ์ทั้งหมดใช้ SQL สำหรับจัดการข้อมูลในตาราง อย่างไรก็ตามก่อนหน้านี้แต่ละฐานข้อมูลเหล่านี้เคยเชื่อมต่อกับแอปพลิเคชัน Python ด้วยความช่วยเหลือของโมดูล Python เฉพาะกับประเภทของฐานข้อมูล
ดังนั้นจึงขาดความเข้ากันได้ในหมู่พวกเขา หากผู้ใช้ต้องการเปลี่ยนเป็นผลิตภัณฑ์ฐานข้อมูลอื่นจะพิสูจน์ได้ยาก ปัญหาความไม่ลงรอยกันนี้ได้รับการแก้ไขโดยการเพิ่ม 'Python Enhancement Proposal (PEP 248)' เพื่อแนะนำอินเทอร์เฟซที่สอดคล้องกันกับฐานข้อมูลเชิงสัมพันธ์ที่เรียกว่า DB-API มีการเรียกคำแนะนำล่าสุดDB-APIเวอร์ชัน 2.0.2 (PEP 249)
ไลบรารีมาตรฐานของ Python ประกอบด้วยโมดูล sqlite3 ซึ่งเป็นโมดูลที่รองรับ DB-API สำหรับจัดการฐานข้อมูล SQLite ผ่านโปรแกรม Python บทนี้อธิบายการเชื่อมต่อของ Python กับฐานข้อมูล SQLite
ดังที่ได้กล่าวไว้ก่อนหน้านี้ Python มีการรองรับฐานข้อมูล SQLite ในรูปแบบของโมดูล sqlite3 สำหรับฐานข้อมูลอื่น ๆ จะต้องติดตั้งโมดูล Python ที่รองรับ DB-API ตามลำดับด้วยความช่วยเหลือของยูทิลิตี้ pip ตัวอย่างเช่นในการใช้ฐานข้อมูล MySQL เราจำเป็นต้องติดตั้งโมดูล PyMySQL
pip install pymysql
แนะนำขั้นตอนต่อไปนี้ใน DB-API -
สร้างการเชื่อมต่อกับฐานข้อมูลโดยใช้ connect() ฟังก์ชั่นและรับวัตถุการเชื่อมต่อ
โทร cursor() วิธีการเชื่อมต่อวัตถุเพื่อรับวัตถุเคอร์เซอร์
สร้างสตริงแบบสอบถามที่ประกอบด้วยคำสั่ง SQL ที่จะดำเนินการ
ดำเนินการค้นหาที่ต้องการโดยเรียกใช้ execute() วิธี.
ปิดการเชื่อมต่อ
import sqlite3
db=sqlite3.connect('test.db')
ในที่นี้ db คือวัตถุเชื่อมต่อที่แสดงถึง test.db โปรดทราบว่าฐานข้อมูลนั้นจะถูกสร้างขึ้นหากยังไม่มีอยู่ db วัตถุการเชื่อมต่อมีวิธีการดังต่อไปนี้ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | cursor(): ส่งคืนวัตถุเคอร์เซอร์ที่ใช้การเชื่อมต่อนี้ |
2 | commit(): กระทำธุรกรรมที่รอดำเนินการกับฐานข้อมูลอย่างชัดเจน |
3 | rollback(): วิธีทางเลือกนี้ทำให้ธุรกรรมถูกย้อนกลับไปที่จุดเริ่มต้น |
4 | close(): ปิดการเชื่อมต่อกับฐานข้อมูลอย่างถาวร |
เคอร์เซอร์ทำหน้าที่เป็นตัวจัดการสำหรับคิวรี SQL ที่กำหนดซึ่งอนุญาตให้เรียกข้อมูลแถวหนึ่งหรือหลายแถวของผลลัพธ์ วัตถุเคอร์เซอร์ได้มาจากการเชื่อมต่อเพื่อดำเนินการสืบค้น SQL โดยใช้คำสั่งต่อไปนี้ -
cur=db.cursor()
วัตถุเคอร์เซอร์มีวิธีการกำหนดไว้ดังนี้ -
ซีเนียร์ No | วิธีการและคำอธิบาย |
---|---|
1 | execute() เรียกใช้แบบสอบถาม SQL ในพารามิเตอร์สตริง |
2 | executemany() เรียกใช้แบบสอบถาม SQL โดยใช้ชุดของพารามิเตอร์ในรายการสิ่งที่เพิ่มขึ้น |
3 | fetchone() ดึงแถวถัดไปจากชุดผลลัพธ์การสืบค้น |
4 | fetchall() ดึงแถวที่เหลือทั้งหมดจากชุดผลการค้นหา |
5 | callproc() เรียกกระบวนงานที่เก็บไว้ |
6 | close() ปิดวัตถุเคอร์เซอร์ |
โค้ดต่อไปนี้สร้างตารางใน test.db: -
import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()
ความสมบูรณ์ของข้อมูลที่ต้องการในฐานข้อมูลทำได้โดย commit() และ rollback()วิธีการของวัตถุการเชื่อมต่อ สตริงแบบสอบถาม SQL อาจมีแบบสอบถาม SQL ที่ไม่ถูกต้องซึ่งอาจทำให้เกิดข้อยกเว้นซึ่งควรได้รับการจัดการอย่างเหมาะสม ด้วยเหตุนี้คำสั่ง execute () จะถูกวางไว้ใน try block หากทำได้สำเร็จผลลัพธ์จะถูกบันทึกอย่างต่อเนื่องโดยใช้เมธอดกระทำ () หากการสืบค้นล้มเหลวธุรกรรมจะถูกยกเลิกโดยใช้เมธอด rollback ()
รหัสต่อไปนี้เรียกใช้แบบสอบถาม INSERT บนตารางนักเรียนใน test.db
import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
cur=db.cursor()
cur.execute(qry)
db.commit()
print ("record added successfully")
except:
print ("error in query")
db.rollback()
db.close()
หากคุณต้องการให้ข้อมูลในประโยคค่าของการสอบถาม INSERT โดยการป้อนข้อมูลของผู้ใช้แบบไดนามิกให้ใช้การแทนที่พารามิเตอร์ตามที่แนะนำใน Python DB-API เดอะ? อักขระถูกใช้เป็นตัวยึดตำแหน่งในสตริงคิวรีและให้ค่าในรูปแบบทูเพิลในเมธอด execute () ตัวอย่างต่อไปนี้แทรกเร็กคอร์ดโดยใช้วิธีการแทนที่พารามิเตอร์ ชื่ออายุและเครื่องหมายถูกนำมาเป็นข้อมูล
import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
cur=db.cursor()
cur.execute(qry, (nm,a,m))
db.commit()
print ("one record added successfully")
except:
print("error in operation")
db.rollback()
db.close()
โมดูล sqlite3 กำหนดไฟล์ executemany()วิธีการที่สามารถเพิ่มหลายระเบียนพร้อมกัน ข้อมูลที่จะเพิ่มควรระบุไว้ในรายการทูเพิลโดยทูเพิลแต่ละตัวจะมีเรกคอร์ดเดียว วัตถุรายการเป็นพารามิเตอร์ของวิธีการดำเนินการ () พร้อมกับสตริงแบบสอบถาม อย่างไรก็ตามวิธีการดำเนินการ () ไม่ได้รับการสนับสนุนโดยโมดูลอื่น ๆ บางส่วน
UPDATEโดยทั่วไปคิวรีจะมีนิพจน์ตรรกะที่ระบุโดย WHERE clause สตริงเคียวรีในเมธอด execute () ควรมีไวยากรณ์เคียวรี UPDATE หากต้องการอัปเดตค่าของ 'age' เป็น 23 สำหรับ name = 'Anil' ให้กำหนดสตริงดังต่อไปนี้:
qry="update student set age=23 where name='Anil';"
เพื่อให้กระบวนการอัพเดตเป็นแบบไดนามิกมากขึ้นเราใช้วิธีการแทนที่พารามิเตอร์ตามที่อธิบายไว้ข้างต้น
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (a, nm))
db.commit()
print("record updated successfully")
except:
print("error in query")
db.rollback()
db.close()
ในทำนองเดียวกันการดำเนินการ DELETE จะดำเนินการโดยเรียกใช้เมธอด execute () ด้วยสตริงที่มีไวยากรณ์คำสั่ง DELETE ของ SQL อนึ่งDELETE แบบสอบถามมักจะมีไฟล์ WHERE อนุประโยค
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (nm,))
db.commit()
print("record deleted successfully")
except:
print("error in operation")
db.rollback()
db.close()
การดำเนินการที่สำคัญอย่างหนึ่งบนตารางฐานข้อมูลคือการดึงข้อมูลจากตาราง SQL ให้SELECTสอบถามเพื่อวัตถุประสงค์ เมื่อสตริงที่มีไวยากรณ์แบบสอบถาม SELECT ถูกกำหนดให้กับเมธอด execute () อ็อบเจ็กต์ชุดผลลัพธ์จะถูกส่งกลับ มีสองวิธีที่สำคัญกับวัตถุเคอร์เซอร์โดยใช้หนึ่งหรือหลายระเบียนจากชุดผลลัพธ์ที่สามารถเรียกคืนได้
fetchone ()
ดึงข้อมูลบันทึกถัดไปจากชุดผลลัพธ์ เป็นทูเพิลประกอบด้วยค่าของแต่ละคอลัมน์ของระเบียนที่ดึงมา
fetchall ()
ดึงข้อมูลที่เหลือทั้งหมดในรูปแบบของรายการสิ่งที่เพิ่มขึ้น ทูเพิลแต่ละตัวสอดคล้องกับหนึ่งเรคคอร์ดและมีค่าของแต่ละคอลัมน์ในตาราง
ตัวอย่างต่อไปนี้แสดงรายการระเบียนทั้งหมดในตารางนักเรียน
import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
record=cur.fetchone()
if record==None:
break
print (record)
db.close()
หากคุณวางแผนที่จะใช้ฐานข้อมูล MySQL แทนฐานข้อมูล SQLite คุณต้องติดตั้ง PyMySQLโมดูลตามที่อธิบายไว้ข้างต้น ขั้นตอนทั้งหมดในกระบวนการเชื่อมต่อฐานข้อมูลเหมือนกันเนื่องจากฐานข้อมูล MySQL ถูกติดตั้งบนเซิร์ฟเวอร์ฟังก์ชัน connect () จึงต้องการ URL และข้อมูลรับรองการเข้าสู่ระบบ
import pymysql
con=pymysql.connect('localhost', 'root', '***')
สิ่งเดียวที่อาจแตกต่างกับ SQLite คือประเภทข้อมูลเฉพาะของ MySQL ในทำนองเดียวกันฐานข้อมูลที่เข้ากันได้กับ ODBC สามารถใช้กับ Python ได้โดยการติดตั้งโมดูล pyodbc