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