Python’s SQLAlchemy và Object-Relational MappingPython’s SQLAlchemy và Declarative
Một nhiệm vụ phổ biến khi bắt đầu xây dựng một web service 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 database hay lấy dữ liệu từ database. Ngày nay, lập trình viên có thể sử dụng object-relational mapping( 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 data trong database với những đối tượng trong các ngôn ngữ lập trình hướng đối tượng. Thông thường, những ngôn ngữ hướng đối tượng như python tồn tại những kiểu không thể thể hiện bằng các kiểu nguyên thủy(giống như là integer, string) .
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 dùng, Một địa chỉ thì phải lưu trữ mã bưu điện của tỉnh/thành phố đó, hay lưu trữ tên đường, số nhà.v.v. Điều này thể hiện trong ngôn ngữ hướng đối tượng như sau:
Một Person object có thể có một danh sách các Address object, và một danh sách các PhoneNumber object. Một Address object có một PostCode object., một StreetName object và một StreetNumber object.
Mặc dù một object đơn giản như PostCode và StreetName có thể biểu diễn bằng các string, nhưng những object phức tạp hơn, giống như Address object hay Person, không thể chỉ sử dụng những kiểu nguyên thủy như String, Integer để thể hiện. 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 class, hoặc các phương thức trong class 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 , 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 class Person, một class Address , một class PhoneNumber và một class mapper để thực hiện việc map một python class với một bảng trong database. Thay vì phải viết những code SQL tẻ nhạt, một ORM có thể mang đển cho bạn những tùy chọn có thể sử dụng trong khi lập trình những logic của hệ thống
Trong thiết kế này, chúng ta có 2 bảng person và address và address.person_id là khóa ngoài của person với bảng address. Giờ chúng ta sẽ viết code một cơ sở dữ liệu tướng ứng trong file 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ẽ chèn một record 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ự hiện việc truy vấn trong cơ sở dữ liệu example.db để lấy những bản ghi. Viết một code sau trong file 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()
và thực hiện câu lệnh sau:
$ 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 sqlite3 conecttion để commit sự thay đổi trong database và một sqlite3 cursor để thực hiện một câu lệnh sql. Mục đích của những cậu lệnh này là CRUD(create, read, update, delete) dữ liệu trong database.
Mặc dù câu lệnh SQL đã 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 việc map mỗi Person và Address với những python class.
Tổng kết
- ở đây có 3 thành phần quan trọng khi viết SQLalchemy code:
- Một bảng(table) trong cơ sở dữ liệu
- Một mapper để map python class và một bảng trong database
- Một class object định nghĩa những 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 định nghĩa trong 1 lớp
- Dưới đây là khai báo các định nghĩa giống như các bảng được định nghĩa trong file 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'
id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)
class Address(Base):
__tablename__ = 'address'
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)
engine = create_engine('sqlite:///sqlalchemy_example.db')
Base.metadata.create_all(engine)
Lưu code trên với tên là sqlalchemy_insert.py và thực thi file đó bằng câu lệnh
python sqlalchemy_insert.py
Giờ đấy chúng ta có một đối tượng Person, 1 đối tượng Address được lưu trữ trong database. Bây giờ chúng ta sẽ thực hiện việc truy vấn trong cơ sở dữ liệu sử dụng những lớp đã định nghĩa trong file sqlalchemy_declarative.py. Thực hiện python console và thực hiện lần lượt những 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()
session.query(Person).all()
<sqlalchemy_declarative.Person object at 0x2ee3a10>
person = session.query(Person).first()
person.name
u'new person'
session.query(Address).filter(Address.person == person).all()
<sqlalchemy_declarative.Address object at 0x2ee3cd0>
session.query(Address).filter(Address.person == person).one()
<sqlalchemy_declarative.Address object at 0x2ee3cd0>
address = session.query(Address).filter(Address.person == person).one()
address.post_code
u'00000'
Nguồn tham khảo
Trong bài này, chúng ta đã học làm sao để có xây dựng một database sử dụng SQLAlchemy’s declaratives. So sánh nó với việc viết những câu lệnh SQL truyền thống trong sqlite3, SQLAlchemy code hướng đối tượng hơn, dễ dàng để đọ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, sửa, xóa các đối tượng SQLAlchemy giống như những đối tượng python thông thường
Top 31 bài viết hay về chủ đề sqlalchemy là gì
Chúng tôi giới thiệu đến độc giả 31 bài viết hay nhất về chủ đề sqlalchemy là gì:
Giới thiệu sqlalchemy trong python(part 1)
ORM là một công nghệ lập trình, cho phép chuyển đổi (convert) từ những data trong database với những đối tượng trong các ngôn ngữ lập trình hướng đối tượng. Xem Thêm
ORM và SQLAlchemy trong quản trị cơ sở dữ liệu
SQLAlchemy là một bộ công cụ SQL mã nguồn mở và ORM sử dụng trong ngôn ngữ lập trình Python, giúp hỗ trợ việc quản lý và thao tác với cơ sở dữ … Xem Thêm
SqlAlchemy trong python (part 3)
SQLALchemy Expression Language cung cấp một hệ thống cho người lập trình viết những câu lệnh SQL sử dung cấu trúc Python. , những hàm khởi tạo được mô hình hóa … Xem Thêm
Các mẫu và phương pháp sử dụng SQLAlchemy 2.0 với …
Các kỹ sư Python coi SQLAlchemy là ORM phổ biến nhất hiện có. … Ngay cả trong trường hợp thuốc phức tạp hơn, tất cả những gì bạn cần làm là sử … Xem Thêm
Hướng dẫn lập trình Flask – Phần 4: Sử dụng cơ sở dữ liệu
Một đặc điểm rất hay của SQLAlchemy là nó hỗ trợ cho rất nhiều cơ sở dữ liệu quan hệ khác nhau như MySQL, PostgreSQL và SQLite. Điều này rất hữu … Xem Thêm
SQLAlchemy – Phần 1 – Xây dựng kiến trúc
Bài này chia sẻ cách tạo kiến trúc database (shema) bằng cách dùng ORM của SQLAlchemy và cơ sở dữ liệu dùng cho loạt bài này chắc chắn là dùng … Xem Thêm
LẬP TRÌNH WEB FLASK-PYTHON #8 – YouTube
Welcome to my Channel ! Chào các bạn! Đây sẽ là video lý thuyết về ORM. SQLAlchemy giúp các bạn tương tác với database mà không cần biết đến … Xem Thêm
Sqlalchemy Python
SQLalchemy là một thư viện Python cung cấp một bản đồ quan hệ đối tượng (ORM) cho cơ sở dữ liệu quan hệ.Nó cho phép bạn ánh xạ các lớp Python … Xem Thêm
Khi nào thì session hết hạn (sql alchemy + postgresql)?
Chào cả nhà, Mình đang làm app, mỗi lần start app thì sẽ dùng code dưới để tạo engine và session dùng cho suốt app Xem Thêm
Cách xây dựng cơ sở dữ liệu bằng Python
Flask-SQLAlchemy là một thư viện để kết nối thư viện SQLAlchemy bên trong dự án Flask của bạn và nó giúp việc triển khai cơ sở dữ liệu của bạn dễ dàng hơn bao … Xem Thêm
SQL Alchemy – hỏi cách auto update database schema
Bác biết đấy sqlalchemy và flask-sqlalchemy là 2 thư viện khác nhau ấy. Với … gì. Home · Categories · FAQ/Guidelines · Terms of Service · Privacy Policy. Xem Thêm
Object-Relational Mapping (ORM) là gì?
Object-Relational Mapping (ORM) là gì? Object-Relational Mapping là … – SQLAlchemy: là một thư viện ORM cho Python, cung cấp một lớp trừu … Xem Thêm
Best practice khi query bằng ORM python (SQLAlchemy)
Giả sử em có mối quan hệ nhiều nhiều giữa User và Room, bảng trung gian là User_In_Room … gì. Theo lý thuyết là nó sẽ query vào các bảng của … Xem Thêm
SQLALCHEMY Tiếng việt là gì – trong Tiếng việt Dịch
What to do with a SqlAlchemy session only used for reads? … Phải làm gì với một phiên SqlAlchemy chỉ được sử dụng để đọc? I am using sqlalchemy for ORM and … Xem Thêm
20 Thư viện Python thông dụng
SQLAlchemy là thư viện ORM (Object Relation Mapping) kết nối tới nhiều loại cơ sở dữ liệu như SQLite, MySQL, Postgresql, Oracle, MS-SQL Server. Xem Thêm
Mô hình o/r mapping – Thằng Quân – WordPress.com
sqlalchemy là một python Framework giúp bạn có thể dễ dàng hơn trong … Vậy nhược điểm của các ORM là gì? Nếu thiết kế không đúng cách bạn … Xem Thêm
Alembic’s documentation! – SQLAlchemy
Welcome to Alembic’s documentation!¶. Alembic is a lightweight database migration tool for usage with the SQLAlchemy Database Toolkit for Python. Xem Thêm
Kỹ thuật scraping và crawling nâng cao với Scrapy và …
… lạ gì với CSS selector. Tuy nhiên, bạn có thể tham khảo thêm về … Bài viết liên quan. Web scraping và crawling với Scrapy và SQLAlchemy. Xem Thêm
Tìm hiểu về ORM và cách nó làm việc trong lập trình
ORM là gì? ORM (Object-Relational Mapping) là một công nghệ trong … Ví dụ, bảng trên cho thấy rằng SQLAlchemy có thể hoạt động với các … Xem Thêm
ORM (Ánh xạ quan hệ đối tượng): tự động ghi dữ liệu
con trăn: Peewee, SQLAlchemy, PonyORM, Elixir, v.v.. Ví dụ với Python và ORM. Peewee là một ORM đơn giản và rút gọn để sử dụng với Python. Bạn có thể … Xem Thêm
CVE-2019-7164: Lỗ hổng trong SQLALchemy (version 1.2.17 …
ORM là gì? ORM là tên viết tắt của cụm từ “Object Relational Mapping … SQLALchemy là gì? SQLAlchemy là một công cụ mã nguồn mở của SQL và … Xem Thêm
Một số package phổ biến trong Python
SQLAlchemy : Là một bộ công cụ Python SQL và Object Relational Mapper cung … scrape: Là một mô-đun Python để duyệt web và sao chép nội dung của trang web. Xem Thêm
Learn SQLAlchemy- Python Query – Ứng dụng trên …
SQLAlchemy cung cấp “một bộ đầy đủ các mẫu kiên trì cấp doanh nghiệp nổi tiếng, được thiết kế để truy cập cơ sở dữ liệu hiệu quả và hiệu … Xem Thêm
Tips about Flask-SQLAlchemy – Nhật Anh’s Blog
Users là bảng người dùng, không có gì đặc biệt. UserLessons là bảng … android connection-pool flask java jdbc linux mysql python sqlalchemy … Xem Thêm
Các framework trong Python năm 2019
Các nhà phát triển Python cần những gì để giúp cuộc sống dễ dàng hơn? … Framework Python dùng thư viện asyncio của Python và là một framework … Xem Thêm
Ví dụ về Relationship và Foreignkey khi lưu dữ liệu từ Scrapy …
Trong mô hình trên, lớp Image là Gallery hình ảnh của lớp Product . Nó có … #models.py – sqlalchemy class Shop_Product(DeclarativeBase): __ … Xem Thêm
10 Python framework hàng đầu để phát triển web năm 2022
Nếu bạn là một developer muốn thử một cái gì đó mới, CherryPy có thể là một chọn lựa phù hợp. Mặc dù với các nhà phát triển kinh nghiệm, … Xem Thêm
ORM là gì? – Lập trình
C#, NHibernate, Entity Framework ; Java, JPA, Hibernate, EclipseLink, Oracle TopLink, OpenJPA ; PHP, Propel, Doctrine, Eloquent, RedBean ; Python, SQLAlchemy, … Xem Thêm
Tìm hiểu thư viện Flask của Python NGUYỄN THỊ HẢI YẾN
2 Thư viện SQLAlchemy. Một nhiệm vụ phổ biến khi bắt đầu xây dựng một web service bất kỳ là làm sao để xây dựng một cơ sở dữ liệu chắc chắn … Xem Thêm
Django dễ hơn Flask – The PyMiers – PyMI.vn
Nếu ai có hỏi “nên học cái nào” thì câu trả lời chuẩn nhất chỉ có một: nên học cả hai. Web framework là gì. Một framework là một bộ thư viện … Xem Thêm
Hướng dẫn lập trình Web với ngôn ngữ Python
Lập trình web với ngôn ngữ Python là gì? 2. Tại sao lại sử dụng … SQLAlchemy app = Flask(__name__) app.config’SQLALCHEMY_DATABASE_URI … Xem Thêm
Top 58 hình ảnh thú vị nhất về chủ đề sqlalchemy là gì
Chúng tôi giới thiệu đến độc giả 58 bài viết hay nhất về chủ đề sqlalchemy là gì:

Tên ảnh: Got-It-Wordpress-featured-image-5.png
Kích cỡ: 536 KB
Kích thước: : 1916×1043 px
Tên ảnh: 77d3877d-2ca3-4eb6-9a64-17267adb6d84.png
Kích cỡ: 0 KB
Kích thước: : 825×309 px

Tên ảnh: orm-la-gi.png
Kích cỡ: 5 KB
Kích thước: : 700×359 px

Tên ảnh: Orm12-1024×171.png
Kích cỡ: 33 KB
Kích thước: : 1024×171 px

Tên ảnh: 1*RJsD8okMHyNnQ9leaAhuBg.png
Kích cỡ: 64 KB
Kích thước: : 1326×312 px

Tên ảnh: sqlalchemy%2B-%2Bpart%2B1%2B-%2Borm%2Bschema.png
Kích cỡ: 25 KB
Kích thước: : 450×150 px

Tên ảnh: d5e9a394-fe86-4ac0-8c65-6566673f6e02.png
Kích cỡ: 71 KB
Kích thước: : 825×428 px

Tên ảnh: Orm13.png
Kích cỡ: 13 KB
Kích thước: : 750×240 px

Tên ảnh: sqlalchemy.jpg
Kích cỡ: 5 KB
Kích thước: : 360×250 px

Tên ảnh: sqlalchemy%2B-%2Bpart%2B1%2B-%2Borm%2Bschema.png
Kích cỡ: 18 KB
Kích thước: : 286×150 px

Tên ảnh: flask-python_320-e1567737120489.png
Kích cỡ: 17 KB
Kích thước: : 320×200 px

Tên ảnh: mqdefault.jpg
Kích cỡ: 11 KB
Kích thước: : 320×180 px

Tên ảnh: mbnh.jpg
Kích cỡ: 165 KB
Kích thước: : 1200×628 px

Tên ảnh: 1634333202_Tim-hieu-ngon-ngu-lap-trinh-pho-bien-nhat-hien.jpg
Kích cỡ: 512 KB
Kích thước: : 2000×1333 px

Tên ảnh: 1*bBo4b_XF0ac7AIGOxcbJpw.png
Kích cỡ: 55 KB
Kích thước: : 1374×258 px

Tên ảnh: 1200px-Guido_van_Rossum_OSCON_2006.jpg
Kích cỡ: 383 KB
Kích thước: : 1200×1800 px

Tên ảnh: django-la-gi.jpg
Kích cỡ: 13 KB
Kích thước: : 1200×628 px

Tên ảnh: sqlite-slqalchemy.png
Kích cỡ: 21 KB
Kích thước: : 491×268 px

Tên ảnh: lap-trinh-python-funix-370×210.jpg
Kích cỡ: 13 KB
Kích thước: : 370×210 px

Tên ảnh: sddefault.jpg
Kích cỡ: 32 KB
Kích thước: : 640×480 px

Tên ảnh: sql-injection.jpg
Kích cỡ: 28 KB
Kích thước: : 838×439 px

Tên ảnh: Orm28-1024×192.png
Kích cỡ: 49 KB
Kích thước: : 1024×192 px

Tên ảnh: 3.1-6.png
Kích cỡ: 93 KB
Kích thước: : 800×710 px

Tên ảnh: lap-trinh-python-5.jpg
Kích cỡ: 97 KB
Kích thước: : 630×353 px

Tên ảnh: employee_table.jpg
Kích cỡ: 57 KB
Kích thước: : 600×373 px

Tên ảnh: flask-framework.jpg
Kích cỡ: 25 KB
Kích thước: : 765×510 px

Tên ảnh: 62c2d7a9f8129a879489a7303ba86d3f9f1a8bf991c13b00454ca9aa8b90462b.png
Kích cỡ: 180 KB
Kích thước: : 786×389 px

Tên ảnh: Wrj18xU.png
Kích cỡ: 61 KB
Kích thước: : 1301×744 px

Tên ảnh: 4-2.jpg
Kích cỡ: 34 KB
Kích thước: : 803×333 px

Tên ảnh: pEogAAc.png
Kích cỡ: 106 KB
Kích thước: : 774×646 px

Tên ảnh: sqlalchemy.jpg
Kích cỡ: 37 KB
Kích thước: : 1024×512 px

Tên ảnh: IMG_QDNW2SRR6Z1S1EXJ.png
Kích cỡ: 327 KB
Kích thước: : 1200×526 px

Tên ảnh: create-engine.png
Kích cỡ: 31 KB
Kích thước: : 746×208 px

Tên ảnh: maxresdefault-696×392.jpg
Kích cỡ: 30 KB
Kích thước: : 696×392 px

Tên ảnh: urmkfvtk3qw.jpg
Kích cỡ: 215 KB
Kích thước: : 1600×1067 px

Tên ảnh: learn-python-for-entrepreneurs.jpg
Kích cỡ: 83 KB
Kích thước: : 1000×718 px

Tên ảnh: odoo.png
Kích cỡ: 121 KB
Kích thước: : 1352×624 px

Tên ảnh: tabla-producto.png
Kích cỡ: 9 KB
Kích thước: : 305×149 px

Tên ảnh: 1*R8vkjOPp-YlY50eyFzplAA.png
Kích cỡ: 13 KB
Kích thước: : 750×240 px

Tên ảnh: pycharm-la-gi.png
Kích cỡ: 35 KB
Kích thước: : 1024×557 px

Tên ảnh: top-python-framework.jpg
Kích cỡ: 0 KB
Kích thước: : 1200×675 px

Tên ảnh: word-image-62173-1.png
Kích cỡ: 1564 KB
Kích thước: : 1200×675 px

Tên ảnh: tai-sao-nen-lap-trinh-web-bang-python.jpg
Kích cỡ: 70 KB
Kích thước: : 1200×628 px

Tên ảnh: Screenshot_2022-07-02_094134.png
Kích cỡ: 46 KB
Kích thước: : 510×854 px

Tên ảnh: Arrays-in-Python-Thumbnail.png
Kích cỡ: 46 KB
Kích thước: : 728×400 px

Tên ảnh: favicon.png
Kích cỡ: 22 KB
Kích thước: : 300×300 px

Tên ảnh: orm-examples.jpg
Kích cỡ: 55 KB
Kích thước: : 1200×495 px

Tên ảnh: entity-framework-thumbnail.jpg
Kích cỡ: 318 KB
Kích thước: : 1131×741 px

Tên ảnh: ry-4icajc28.jpg
Kích cỡ: 156 KB
Kích thước: : 1600×1068 px

Tên ảnh: cau-hoi-phong-van-lap-trinh-vien-945×557-1.jpg
Kích cỡ: 37 KB
Kích thước: : 945×557 px

Tên ảnh: vi-du-ve-cach-su-dung-repository-pattern-trong-java.jpg
Kích cỡ: 27 KB
Kích thước: : 512×512 px

Tên ảnh: sqlalchemy-2-query.png
Kích cỡ: 25 KB
Kích thước: : 450×150 px

Tên ảnh: 1-4-300×170.jpg
Kích cỡ: 10 KB
Kích thước: : 300×170 px

Tên ảnh: lap-trinh-python-2.jpg
Kích cỡ: 94 KB
Kích thước: : 630×393 px

Tên ảnh: django.png
Kích cỡ: 20 KB
Kích thước: : 1200×418 px

Tên ảnh: sddefault.jpg
Kích cỡ: 40 KB
Kích thước: : 640×480 px

Tên ảnh: Orm27.png
Kích cỡ: 13 KB
Kích thước: : 750×240 px

Tên ảnh: word-image-62173-2.png
Kích cỡ: 660 KB
Kích thước: : 1128×635 px