Độ bền dữ liệu Python - SQLAlchemy

Bất kỳ cơ sở dữ liệu quan hệ nào cũng chứa dữ liệu trong các bảng. Cấu trúc bảng xác định kiểu dữ liệu của các thuộc tính về cơ bản chỉ thuộc kiểu dữ liệu chính được ánh xạ tới các kiểu dữ liệu tích hợp sẵn tương ứng của Python. Tuy nhiên, các đối tượng do người dùng định nghĩa của Python không thể được lưu trữ và truy xuất liên tục đến / từ các bảng SQL.

Đây là sự khác biệt giữa các kiểu SQL và các ngôn ngữ lập trình hướng đối tượng như Python. SQL không có kiểu dữ liệu tương đương cho những người khác như dict, tuple, list hoặc bất kỳ lớp nào do người dùng xác định.

Nếu bạn phải lưu trữ một đối tượng trong cơ sở dữ liệu quan hệ, thì các thuộc tính phiên bản của nó phải được giải cấu trúc thành các kiểu dữ liệu SQL trước, trước khi thực hiện truy vấn INSERT. Mặt khác, dữ liệu được truy xuất từ ​​bảng SQL thuộc kiểu chính. Một đối tượng Python thuộc kiểu mong muốn sẽ phải được xây dựng bằng cách sử dụng để sử dụng trong tập lệnh Python. Đây là nơi mà Trình lập bản đồ quan hệ đối tượng rất hữu ích.

Bản đồ quan hệ đối tượng (ORM)

An Object Relation Mapper(ORM) là một giao diện giữa một lớp và một bảng SQL. Một lớp Python được ánh xạ tới một bảng nhất định trong cơ sở dữ liệu, để việc chuyển đổi giữa các kiểu đối tượng và SQL được tự động thực hiện.

Lớp Học sinh được viết bằng mã Python được ánh xạ tới bảng Học sinh trong cơ sở dữ liệu. Kết quả là, tất cả các hoạt động CRUD được thực hiện bằng cách gọi các phương thức tương ứng của lớp. Điều này giúp loại bỏ nhu cầu thực thi các truy vấn SQL được mã hóa cứng trong tập lệnh Python.

Do đó, thư viện ORM hoạt động như một lớp trừu tượng trên các truy vấn SQL thô và có thể giúp ích trong việc phát triển ứng dụng nhanh chóng. SQLAlchemylà một trình ánh xạ quan hệ đối tượng phổ biến cho Python. Bất kỳ thao tác nào về trạng thái của đối tượng mô hình đều được đồng bộ hóa với hàng liên quan của nó trong bảng cơ sở dữ liệu.

Thư viện SQLALchemy bao gồm ORM API và Ngôn ngữ biểu thức SQL (SQLAlchemy Core). Ngôn ngữ biểu thức thực thi trực tiếp các cấu trúc nguyên thủy của cơ sở dữ liệu quan hệ.

ORM là một kiểu sử dụng cấp cao và trừu tượng được xây dựng trên ngôn ngữ biểu thức SQL. Có thể nói ORM là một cách sử dụng được áp dụng của Ngôn ngữ biểu hiện. Chúng ta sẽ thảo luận về API SQLAlchemy ORM và sử dụng cơ sở dữ liệu SQLite trong chủ đề này.

SQLAlchemy giao tiếp với nhiều loại cơ sở dữ liệu khác nhau thông qua triển khai DBAPI tương ứng của chúng bằng cách sử dụng hệ thống phương ngữ. Tất cả các phương ngữ đều yêu cầu phải cài đặt trình điều khiển DBAPI thích hợp. Các phương ngữ cho loại cơ sở dữ liệu sau được bao gồm:

  • Firebird
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL
  • SQLite
  • Sybase

Cài đặt SQLAlchemy rất dễ dàng và đơn giản, sử dụng tiện ích pip.

pip install sqlalchemy

Để kiểm tra xem SQLalchemy có được cài đặt đúng cách và phiên bản của nó hay không, hãy nhập thông tin sau trên lời nhắc Python:

>>> import sqlalchemy
>>>sqlalchemy.__version__
'1.3.11'

Tương tác với cơ sở dữ liệu được thực hiện thông qua đối tượng Engine thu được dưới dạng giá trị trả về create_engine() chức năng.

engine =create_engine('sqlite:///mydb.sqlite')

SQLite cho phép tạo cơ sở dữ liệu trong bộ nhớ. Công cụ SQLAlchemy cho cơ sở dữ liệu trong bộ nhớ được tạo như sau:

from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')

Nếu bạn định sử dụng cơ sở dữ liệu MySQL thay thế, hãy sử dụng mô-đun DB-API của nó - pymysql và trình điều khiển phương ngữ tương ứng.

engine = create_engine('mysql+pymydsql://root@localhost/mydb')

Create_engine có một đối số echo tùy chọn. Nếu được đặt thành true, các truy vấn SQL do engine tạo ra sẽ được lặp lại trên thiết bị đầu cuối.

SQLAlchemy chứa declarative baselớp học. Nó hoạt động như một danh mục các lớp mô hình và các bảng được ánh xạ.

from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()

Bước tiếp theo là xác định một lớp mô hình. Nó phải được dẫn xuất từ ​​cơ sở - đối tượng của lớp explore_base như trên.

Bộ __tablename__ thuộc tính tên của bảng mà bạn muốn được tạo trong cơ sở dữ liệu. Các thuộc tính khác tương ứng với các trường. Mỗi cái là một đối tượng Cột trong SQLAlchemy và kiểu dữ liệu của nó là từ một trong những danh sách dưới đây:

  • BigInteger
  • Boolean
  • Date
  • DateTime
  • Float
  • Integer
  • Numeric
  • SmallInteger
  • String
  • Text
  • Time

Mã sau là lớp mô hình có tên là Sinh viên được ánh xạ tới bảng Sinh viên.

#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)

Để tạo bảng Sinh viên có cấu trúc tương ứng, hãy thực thi phương thức create_all () được định nghĩa cho lớp cơ sở.

base.metadata.create_all(engine)

Bây giờ chúng ta phải khai báo một đối tượng của lớp Sinh viên của chúng ta. Tất cả các giao dịch cơ sở dữ liệu như thêm, xóa hoặc truy xuất dữ liệu từ cơ sở dữ liệu, v.v., được xử lý bởi một đối tượng Session.

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()

Dữ liệu được lưu trữ trong đối tượng Student được thêm vào bảng bên dưới bằng phương thức add () của phiên.

s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()

Đây là toàn bộ mã để thêm bản ghi trong bảng sinh viên. Khi nó được thực thi, nhật ký câu lệnh SQL tương ứng được hiển thị trên bảng điều khiển.

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()

Đầu ra bảng điều khiển

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

Các session đối tượng cũng cung cấp phương thức add_all () để chèn nhiều đối tượng trong một giao dịch.

sessionobj.add_all([s2,s3,s4,s5])
sessionobj.commit()

Bây giờ, các bản ghi được thêm vào bảng, chúng tôi muốn tìm nạp từ nó giống như truy vấn SELECT. Đối tượng phiên có phương thức query () để thực hiện tác vụ. Đối tượng truy vấn được trả về bằng phương thức query () trên mô hình Sinh viên của chúng tôi.

qry=seesionobj.query(Student)

Sử dụng phương thức get () của đối tượng Truy vấn này tìm nạp đối tượng tương ứng với khóa chính đã cho.

S1=qry.get(1)

Trong khi câu lệnh này được thực thi, câu lệnh SQL tương ứng của nó được lặp lại trên bảng điều khiển sẽ như sau:

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,)

Phương thức query.all () trả về danh sách tất cả các đối tượng có thể được duyệt qua bằng vòng lặp.

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)

Cập nhật một bản ghi trong bảng ánh xạ là rất dễ dàng. Tất cả những gì bạn phải làm là tìm nạp một bản ghi bằng phương thức get (), gán một giá trị mới cho thuộc tính mong muốn và sau đó thực hiện các thay đổi bằng đối tượng phiên. Dưới đây, chúng tôi thay đổi điểm của học sinh Juhi thành 100.

S1=qry.get(1)
S1.marks=100
sessionobj.commit()

Xóa bản ghi cũng dễ dàng như vậy, bằng cách xóa đối tượng mong muốn khỏi phiên.

S1=qry.get(1)
Sessionobj.delete(S1)
sessionobj.commit()