Cơ sở dữ liệu quan hệ trong python

Một nhiệm vụ phổ biến khi bắt đầu xây dựng một dịch vụ web bất kỳ là làm sao để xây dựng một cơ sở dữ liệu chắc chắn, bền vững. Trong quá khứ, lập trình viên sẽ phải viết những câu lệnh SQL, thông qua chúng, để thiết lập cơ sở dữ liệu hoặc lấy dữ liệu từ cơ sở dữ liệu. Ngày nay, lập trình viên có thể sử dụng ánh xạ quan hệ đối tượng [ORM] thay vì các câu lệnh SQL phức tạp và khó khăn trong việc bảo trì, đọc hiểu và chỉnh sửa.

ORM là một công nghệ lập trình, cho phép chuyển đổi [convert] từ những dữ liệu trong cơ sở dữ liệu với những đối tượng trong ngôn ngữ lập trình hướng đối tượng. Thông thường, các đối tượng hướng ngôn ngữ như python tồn tại những kiểu không thể hiện bằng các kiểu nguyên thủy[giống như số nguyên, chuỗi]

Ví dụ, Một người có thể có các địa chỉ nhà ở khác nhau, như địa chỉ thường trú chỗ này , chỗ kia, có một, vài số điện thoại hay sử dụng, Một địa chỉ thì phải lưu trữ mã bưu điện của tỉnh/ . v. v. Điều này có thể hiển thị trong các đối tượng hướng ngôn ngữ như sau

Một đối tượng Người có thể có một danh sách các đối tượng Địa chỉ và một danh sách các đối tượng Số điện thoại. Một đối tượng Địa chỉ có một đối tượng Mã bưu điện. , một đối tượng StreetName và một đối tượng StreetNumber

Mặc dù một đối tượng đơn giản như PostCode và StreetName có thể biểu diễn bằng các chuỗi, nhưng những đối tượng này phức tạp hơn, giống như đối tượng Địa chỉ hoặc Người, không thể chỉ sử dụng các kiểu nguyên thủy như Chuỗi, Số nguyên để hiển thị. Thêm vào đó, những đối tượng phức tạp có thể bao gồm các thể hiện của một lớp, hoặc các phương thức trong lớp không thể sử dụng 1 kiểu cho tất cả các trường hợp

Để quản lý những đối tượng phức tạp, con người đã phát triển một lớp hệ thống mới, được gọi là ORM. Ở ví dụ trước của chúng ta, ORM có thể xây dựng với các thành phần. một lớp Người, một lớp Địa chỉ, một lớp Số điện thoại và một trình ánh xạ lớp để thực hiện việc ánh xạ một lớp python với một bảng trong cơ sở dữ liệu. Thay vì phải viết những mã SQL nhạt màu, một ORM có thể mang đến cho bạn những tùy chọn có thể sử dụng trong khi thiết lập các logic của hệ thống

Trong thiết kế này, chúng ta có 2 bảng người và địa chỉ và địa chỉ. person_id is the outside of person with the table address. Giờ chúng ta sẽ viết mã cơ sở dữ liệu chung trong tệp sqlite_ex. py


    import sqlite3
    conn = sqlite3.connect['example.db']

    c = conn.cursor[]
    c.execute['''
              CREATE TABLE person
              [id INTEGER PRIMARY KEY ASC, name varchar[250] NOT NULL]
              ''']
    c.execute['''
              CREATE TABLE address
              [id INTEGER PRIMARY KEY ASC, street_name varchar[250], street_number varchar[250],
               post_code varchar[250] NOT NULL, person_id INTEGER NOT NULL,
               FOREIGN KEY[person_id] REFERENCES person[id]]
              ''']

    c.execute['''
              INSERT INTO person VALUES[1, 'pythoncentral']
              ''']
    c.execute['''
              INSERT INTO address VALUES[1, 'python road', '1', '00000', 1]
              ''']

    conn.commit[]
    conn.close[]

Chú ý rằng chúng ta sẽ thêm một bản ghi vào mỗi bảng. thực hiện câu lệnh sau

    $ python sqlite_ex.py

Giờ chúng ta có thể thực hiện truy vấn trong cơ sở dữ liệu ví dụ. db to get the ghi chép. Viết một mã sau trong tệp sqlite_q. py

    import sqlite3
    conn = sqlite3.connect['example.db']

    c = conn.cursor[]
    c.execute['SELECT * FROM person']
    print c.fetchall[]
    c.execute['SELECT * FROM address']
    print c.fetchall[]
    conn.close[]

and done the command after

    $ python sqlite_q.py
    [[1, u'pythoncentral']]
    [[1, u'python road', u'1', u'00000', 1]]

Ở ví dụ trước, chúng ta sử dụng 1 kết nối sqlite3 để thực hiện sự thay đổi trong cơ sở dữ liệu và một con trỏ sqlite3 để thực hiện một câu lệnh sql. Mục đích của những lệnh này là CRUD[tạo, đọc, cập nhật, xóa] dữ liệu trong cơ sở dữ liệu

Mặc dù câu lệnh SQL đã được thực thi, nhưng nó không dễ dàng đọc hiểu, hay thay đổi. Trong giai đoạn tiếp theo, chúng ta sẽ sử dụng những khai báo SQLAlchemy để thực hiện map Mỗi người và Địa chỉ với các lớp python

SQLAlchemy của Python và Khai báo

  • ở đây có 3 thành phần quan trọng khi viết mã SQLalchemy
    • Một bảng[table] trong cơ sở dữ liệu
    • Một trình ánh xạ để ánh xạ lớp python và một bảng trong cơ sở dữ liệu
    • Một đối tượng lớp định nghĩa các thành phần của đối tượng
  • Thay vì viết code cho table, mapper và class object ở những nơi khác nhau, SQLALchemy declarative đồng ý cho việc table, mapper và class object được định nghĩa trong 1 lớp
  • Dưới đây là thông báo các định nghĩa giống như các bảng được định nghĩa trong tệp sqlite_ex. py

    import os
    import sys
    from sqlalchemy import Column, ForeignKey, Integer, String
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    from sqlalchemy import create_engine

    Base = declarative_base[]

    class Person[Base]:
        __tablename__ = 'person'
        # Here we define columns for the table person
        # Notice that each column is also a normal Python instance attribute.
        id = Column[Integer, primary_key=True]
        name = Column[String[250], nullable=False]

    class Address[Base]:
        __tablename__ = 'address'
        # Here we define columns for the table address.
        # Notice that each column is also a normal Python instance attribute.
        id = Column[Integer, primary_key=True]
        street_name = Column[String[250]]
        street_number = Column[String[250]]
        post_code = Column[String[250], nullable=False]
        person_id = Column[Integer, ForeignKey['person.id']]
        person = relationship[Person]

    # Create an engine that stores data in the local directory's
    # sqlalchemy_example.db file.
    engine = create_engine['sqlite:///sqlalchemy_example.db']

    # Create all tables in the engine. This is equivalent to "Create Table"
    # statements in raw SQL.
    Base.metadata.create_all[engine]

Save code on with name is sqlalchemy_insert. py và thực thi tập tin đó bằng câu lệnh

    python sqlalchemy_insert.py

Giờ đấy chúng ta có 1 đối tượng Person, 1 đối tượng Address được lưu trữ trong cơ sở dữ liệu. Bây giờ chúng ta sẽ thực hiện việc truy vấn trong cơ sở dữ liệu bằng cách sử dụng những lớp đã được định nghĩa trong tệp sqlalchemy_declarative. py. Thực hiện bảng điều khiển python và thực hiện lần lượt các câu lệnh sau

        from sqlalchemy_declarative import Person, Base, Address
        from sqlalchemy import create_engine
        engine = create_engine['sqlite:///sqlalchemy_example.db']
        Base.metadata.bind = engine
        from sqlalchemy.orm import sessionmaker
        DBSession = sessionmaker[]
        DBSession.bind = engine
        session = DBSession[]
        #Make a query to find all Persons in the database
        session.query[Person].all[]
        []

        # Return the first Person from all Persons in the database
        person = session.query[Person].first[]
        person.name
        u'new person'

        # Find all Address whose person field is pointing to the person object
        session.query[Address].filter[Address.person == person].all[]
        []

        # Retrieve one Address whose person field is point to the person object
        session.query[Address].filter[Address.person == person].one[]
        
        address = session.query[Address].filter[Address.person == person].one[]
        address.post_code
        u'00000'

Tổng kết

Trong bài này, chúng ta đã nghiên cứu làm sao để có thể xây dựng một cơ sở dữ liệu bằng cách sử dụng các khai báo của SQLAlchemy. So sánh nó với việc viết các câu lệnh SQL truyền thống trong sqlite3, mã SQLAlchemy hướng đối tượng hơn, dễ đọc và duy trì hơn. Thêm vào đó, chúng ta có thể dễ dàng thực hiện việc tạo mới, chỉnh sửa, xóa các đối tượng SQLAlchemy giống như các đối tượng python thông thường

Chủ Đề