ความคงอยู่ของข้อมูล Python - SQLAlchemy
ฐานข้อมูลเชิงสัมพันธ์ใด ๆ เก็บข้อมูลในตาราง โครงสร้างตารางกำหนดประเภทข้อมูลของแอตทริบิวต์ซึ่งโดยพื้นฐานแล้วเป็นประเภทข้อมูลหลักเท่านั้นที่แมปกับชนิดข้อมูลในตัวของ Python ที่เกี่ยวข้อง อย่างไรก็ตามอ็อบเจ็กต์ที่ผู้ใช้กำหนดเองของ Python ไม่สามารถจัดเก็บและดึงข้อมูลไปยัง / จากตาราง SQL ได้อย่างต่อเนื่อง
นี่คือความแตกต่างระหว่างประเภท SQL และภาษาโปรแกรมเชิงวัตถุเช่น Python SQL ไม่มีชนิดข้อมูลที่เทียบเท่าสำหรับผู้อื่นเช่น dict, tuple, list หรือคลาสที่ผู้ใช้กำหนด
หากคุณต้องจัดเก็บอ็อบเจ็กต์ในฐานข้อมูลเชิงสัมพันธ์แอ็ตทริบิวต์อินสแตนซ์นั้นควรถูกแยกโครงสร้างออกเป็นชนิดข้อมูล SQL ก่อนที่จะดำเนินการสอบถาม INSERT ในทางกลับกันข้อมูลที่ดึงมาจากตาราง SQL จะอยู่ในประเภทหลัก จะต้องสร้างวัตถุ Python ประเภทที่ต้องการโดยใช้เพื่อใช้ในสคริปต์ Python นี่คือจุดที่ Object Relational Mappers มีประโยชน์
ตัวทำแผนที่ความสัมพันธ์ของวัตถุ (ORM)
อัน Object Relation Mapper(ORM) คืออินเทอร์เฟซระหว่างคลาสและตาราง SQL คลาส Python ถูกแมปกับตารางบางตารางในฐานข้อมูลดังนั้นการแปลงระหว่างออบเจ็กต์และประเภท SQL จะดำเนินการโดยอัตโนมัติ
ชั้นเรียนของนักเรียนที่เขียนด้วยรหัส Python จะถูกจับคู่กับตารางนักเรียนในฐานข้อมูล เป็นผลให้การดำเนินการ CRUD ทั้งหมดทำได้โดยการเรียกใช้เมธอดตามลำดับของคลาส สิ่งนี้ช่วยลดความจำเป็นในการดำเนินการแบบสอบถาม SQL ที่เข้ารหัสยากในสคริปต์ Python
ดังนั้นไลบรารี ORM จึงทำหน้าที่เป็นเลเยอร์นามธรรมเหนือแบบสอบถาม SQL ดิบและสามารถช่วยในการพัฒนาแอปพลิเคชันอย่างรวดเร็ว SQLAlchemyเป็นตัวทำแผนที่เชิงสัมพันธ์วัตถุยอดนิยมสำหรับ Python การจัดการสถานะของโมเดลอ็อบเจ็กต์ใด ๆ จะซิงโครไนซ์กับแถวที่เกี่ยวข้องในตารางฐานข้อมูล
ไลบรารี SQLALchemy ประกอบด้วย ORM API และภาษานิพจน์ SQL (SQLAlchemy Core). ภาษานิพจน์เรียกใช้โครงสร้างดั้งเดิมของฐานข้อมูลเชิงสัมพันธ์โดยตรง
ORM เป็นรูปแบบการใช้งานระดับสูงและเป็นนามธรรมที่สร้างขึ้นจาก SQL Expression Language อาจกล่าวได้ว่า ORM เป็นการใช้งาน Expression Language เราจะพูดถึง SQLAlchemy ORM API และใช้ฐานข้อมูล SQLite ในหัวข้อนี้
SQLAlchemy สื่อสารกับฐานข้อมูลประเภทต่างๆผ่านการใช้งาน DBAPI ตามลำดับโดยใช้ระบบภาษาถิ่น ภาษาถิ่นทั้งหมดต้องการให้ติดตั้งไดรเวอร์ DBAPI ที่เหมาะสม รวมภาษาสำหรับฐานข้อมูลประเภทต่อไปนี้ -
- Firebird
- Microsoft SQL Server
- MySQL
- Oracle
- PostgreSQL
- SQLite
- Sybase
การติดตั้ง SQLAlchemy นั้นง่ายและตรงไปตรงมาโดยใช้ยูทิลิตี้ pip
pip install sqlalchemy
หากต้องการตรวจสอบว่า SQLalchemy ได้รับการติดตั้งและเวอร์ชันอย่างถูกต้องหรือไม่ให้ป้อนคำสั่งต่อไปนี้ใน Python prompt -
>>> import sqlalchemy
>>>sqlalchemy.__version__
'1.3.11'
การโต้ตอบกับฐานข้อมูลทำได้ผ่านอ็อบเจ็กต์ Engine ที่ได้รับเป็นค่าส่งคืนของ create_engine() ฟังก์ชัน
engine =create_engine('sqlite:///mydb.sqlite')
SQLite อนุญาตให้สร้างฐานข้อมูลในหน่วยความจำ โปรแกรม SQLAlchemy สำหรับฐานข้อมูลในหน่วยความจำถูกสร้างขึ้นดังนี้ -
from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')
หากคุณต้องการใช้ฐานข้อมูล MySQL แทนให้ใช้โมดูล DB-API - pymysql และไดร์เวอร์ภาษาถิ่นตามลำดับ
engine = create_engine('mysql+pymydsql://root@localhost/mydb')
create_engine มีอาร์กิวเมนต์ echo ที่เป็นทางเลือก หากตั้งค่าเป็นจริงแบบสอบถาม SQL ที่สร้างโดยเอ็นจิ้นจะสะท้อนบนเทอร์มินัล
SQLAlchemy ประกอบด้วย declarative baseชั้นเรียน ทำหน้าที่เป็นแคตตาล็อกของคลาสโมเดลและตารางที่แมป
from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()
ขั้นตอนต่อไปคือการกำหนดคลาสโมเดล มันต้องได้มาจาก base - object ของคลาส declarative_base ตามด้านบน
ตั้งค่า __tablename__ คุณสมบัติเพื่อตั้งชื่อตารางที่คุณต้องการสร้างในฐานข้อมูล แอตทริบิวต์อื่น ๆ สอดคล้องกับฟิลด์ แต่ละอันเป็นวัตถุคอลัมน์ใน SQLAlchemy และประเภทข้อมูลมาจากรายการใดรายการหนึ่งด้านล่าง -
- BigInteger
- Boolean
- Date
- DateTime
- Float
- Integer
- Numeric
- SmallInteger
- String
- Text
- Time
โค้ดต่อไปนี้คือคลาสโมเดลที่มีชื่อว่า Student ที่แมปกับตาราง Students
#myclasses.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Numeric
base=declarative_base()
class Student(base):
__tablename__='Students'
StudentID=Column(Integer, primary_key=True)
name=Column(String)
age=Column(Integer)
marks=Column(Numeric)
ในการสร้างตารางนักเรียนที่มีโครงสร้างที่สอดคล้องกันให้รันเมธอด create_all () ที่กำหนดไว้สำหรับคลาสฐาน
base.metadata.create_all(engine)
ตอนนี้เราต้องประกาศเรื่องของคลาสนักเรียนของเรา ธุรกรรมฐานข้อมูลทั้งหมดเช่นเพิ่มลบหรือดึงข้อมูลจากฐานข้อมูล ฯลฯ จะถูกจัดการโดยวัตถุเซสชัน
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
ข้อมูลที่เก็บไว้ในวัตถุของนักเรียนจะถูกเพิ่มทางกายภาพในตารางพื้นฐานโดยวิธี add () ของเซสชัน
s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()
นี่คือรหัสทั้งหมดสำหรับการเพิ่มบันทึกในตารางนักเรียน ขณะที่ดำเนินการบันทึกคำสั่ง SQL ที่เกี่ยวข้องจะแสดงบนคอนโซล
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from myclasses import Student, base
engine = create_engine('sqlite:///college.db', echo=True)
base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()
เอาต์พุตคอนโซล
CREATE TABLE "Students" (
"StudentID" INTEGER NOT NULL,
name VARCHAR,
age INTEGER,
marks NUMERIC,
PRIMARY KEY ("StudentID")
)
INFO sqlalchemy.engine.base.Engine ()
INFO sqlalchemy.engine.base.Engine COMMIT
INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
INFO sqlalchemy.engine.base.Engine INSERT INTO "Students" (name, age, marks) VALUES (?, ?, ?)
INFO sqlalchemy.engine.base.Engine ('Juhi', 25, 200.0)
INFO sqlalchemy.engine.base.Engine COMMIT
session นอกจากนี้ยังมีวิธี add_all () เพื่อแทรกวัตถุมากกว่าหนึ่งรายการในธุรกรรมเดียว
sessionobj.add_all([s2,s3,s4,s5])
sessionobj.commit()
ตอนนี้มีการเพิ่มระเบียนในตารางแล้วเราต้องการดึงข้อมูลจากมันเช่นเดียวกับแบบสอบถาม SELECT วัตถุเซสชันมีเมธอด query () เพื่อดำเนินงาน วัตถุแบบสอบถามจะถูกส่งกลับโดยวิธีการ query () ในแบบจำลองนักเรียนของเรา
qry=seesionobj.query(Student)
ใช้เมธอด get () ของอ็อบเจ็กต์ Query นี้ดึงอ็อบเจ็กต์ที่สอดคล้องกับคีย์หลักที่กำหนด
S1=qry.get(1)
ในขณะที่ดำเนินการคำสั่งนี้คำสั่ง SQL ที่สอดคล้องกันที่สะท้อนบนคอนโซลจะเป็นดังนี้ -
BEGIN (implicit)
SELECT "Students"."StudentID" AS "Students_StudentID", "Students".name AS
"Students_name", "Students".age AS "Students_age",
"Students".marks AS "Students_marks"
FROM "Students"
WHERE "Products"."Students" = ?
sqlalchemy.engine.base.Engine (1,)
วิธีการ query.all () ส่งคืนรายการของวัตถุทั้งหมดที่สามารถข้ามผ่านได้โดยใช้ลูป
from sqlalchemy import Column, Integer, String, Numeric
from sqlalchemy import create_engine
from myclasses import Student,base
engine = create_engine('sqlite:///college.db', echo=True)
base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
qry=sessionobj.query(Students)
rows=qry.all()
for row in rows:
print (row)
การอัปเดตเรกคอร์ดในตารางที่แมปนั้นทำได้ง่ายมาก สิ่งที่คุณต้องทำคือดึงเร็กคอร์ดโดยใช้เมธอด get () กำหนดค่าใหม่ให้กับแอ็ตทริบิวต์ที่ต้องการจากนั้นยอมรับการเปลี่ยนแปลงโดยใช้วัตถุเซสชัน ด้านล่างเราเปลี่ยนเครื่องหมายของนักเรียน Juhi เป็น 100
S1=qry.get(1)
S1.marks=100
sessionobj.commit()
การลบบันทึกทำได้ง่ายเพียงแค่ลบวัตถุที่ต้องการออกจากเซสชัน
S1=qry.get(1)
Sessionobj.delete(S1)
sessionobj.commit()