0

Một số Điều hay vấp phải khi bắt đầu học sqlalchemy

Dạo gần đây tôi có bắt đầu tìm hiểu về sqlalchemy. Qua nhiều khó khăn ban đầu trong việc tiếp xúc và tìm hiểu, bài viết này sẽ đưa ra những một số khó khăn mà những người mới bắt đầu tìm hiểu sqlalchemy nói riêng và những ngôn ngữ lập trình mới nói chung. Hy vọng bài viết sẽ giúp ích cho những người mới bắt đầu tìm hiểu về sqlalchemy.

1. Không tìm đúng được tutorial
Có một số người khi bắt đầu thường hỏi là nên học theo một tutorial nào đó để có được một cái nhìn đầu tiên , khái quát và dễ hiểu về cái mà họ muốn tìm hiểu. Điều đó tôi cũng thường làm. Việc thông thường đầu tiên thường được tôi chú trọng tìm hiểu là những tutorial có sẵn trên trang chủ của slqalchemy.

Tuy nhiên trên sqlalchemy.org trong thư viện lại có rất nhiều tutorial cho những phần khác nhau và mục đích khác nhau, việc lựa chọn một tutorial phù hợp với mục đích tìm hiểu của mình và hoàn thành nó trong thời gian có hạn là khó khăn. Nhiều người muốn tìm có một tutorial nào đó ngoài sqlalchemy.org để có thể thực hiện một cách chính xác và đầy đủ về sqlalchemy, và đôi khi họ cũng nhận được một số đường dẫn đến những trang web chứa một hay một số tutorial có ích để bắt đầu việc tìm hiểu sqlalchemy. Nhưng cũng đôi khi, họ thực hiện những tutorial được tác gỉa viết cách thời điểm hiện tại một khoảng thời gian khá lâu rồi, thực hiện với những phiên bản cũ và không còn đúng với phiên bản của hiện tại.
</br> Tuy nhiên, tôi nghĩ bạn không qúa băn khoăn vì điều đó, điều quan trọng khi thực hiện tutorial là có những hiểu biết khái quát và nếm thử một chút xem mùi vị của sqlalchemy mà thôi. Khi có một số hiểu biết nhất định, bạn sẽ tìm ra điều gì quan trọng được đề cập đến trong tutorial mà bạn đã thực hiện và có quyết định thực hiện một tutorial khác hay không là một điều lúc đó bạn có thể quyết định.

2. Sử dụng các hàm khởi tạo mẫu
Declarative metaclass cung cấp sẵn những hàm khởi tạo mặc định cho những model class, việc tạo ra hay gộp những hàm khởi tạo này lại là không cần thiết. Dường như rất nhiều người không biết điều đó, họ viết hàm khởi tạo trong mỗi class . Điểm này cũng không được chỉ ra rõ ràng trong các tài liệu của sqlalchemalchemy.
Nhưng theo tôi bạn nên hủy bỏ các hàm khởi tạo(constructors), thay thế việc viết hàm khởi tạo nhận các đối số là gía trị các trường bạn có thể tạo một đối tượng với câu lệnh giống như là Company(name="Foo", address="Bar") chẳng hạn

3. Nhầm tưởng rằng khi tạo mới hay thay đổi một class cũng là tạo mới và thay đổi bảng dữ liệu của chúng trong cơ sở dữ liệu
Một điều đáng ngạc nhiên là hầu hết những người mới tìm hiểu sqlalchemy cho rằng khi họ thực hiện việc thay đổi các classs, slqalchemy sẽ tự động thay đổi những điều đó trong cơ sở dữ liệu. Tôi chưa biết bất cứ một ORM nào làm điều đó một cách tự động và có sự tin cậy và khả năng chính xác cao cả.
Khi bạn thực hiện những thay đổi của những lớp đã khai báo. bạn cần phải update những thay đổi đó vào schema của database, bạn chỉ làm được điều này thông qua câu lệnh hoặc thư viện migration nào đó.

4. Quên import module model khi thử gọi hàm metadata.create_all
Hàm metadata.create_all được sử dụng để tạo mọi bảng trong cơ sở dữ liệu của bạn. Tuy nhiên trước khi điều đó xảy ra bạn cần import các module chứa định nghĩa về model của bạn trước có phải không?
Bạn không cần hiểu metadata.create_all hoạt động như thế nào, nhưng về mặt logic, bạn thử nghĩ xem, dù người xây dựng hàm metadata.create_all có thần thánh đến mức nào, thì ông ta cũng không thể thực hiện việc tạo ra các bảng mà không biết nó được định nghĩa ở đâu. Hay bạn nghĩ có một thuật toán nào đó đủ thông minh để thực hiện một điều tương tự?

5. Không phân biệt được khi nào dùng .one(), .first(), .scalar()</br> Khi bắt đầu tìm hiểu về sqlalchemy, tôi cũng không thực sự hiểu được khi nào thì dùng .one(), .first(), .scalar(), mặc dù đã đọc qua định nghĩa hàm. Điều đó không có gì là xấu hổ với một người mới cả. Tuy nhiên, nếu bạn là người mới thì tôi hy vọng sẽ giúp được bạn một chút dù là nhỏ nhoi

<li>Query.one(): thực hiện câu lệnh truy vấn và trả về MultipleResultsFound nếu số dòng lớn hơn 1 và NoResultFound nếu không có dòng dữ liệu nào trả về.
Nó chỉ trả về kết qủa nếu kết qủa của câu truy vấn là 1 và chỉ 1 record trong database</li> <li>Query.first(): Thực hiện câu lệnh query và trả về gía trị đầu tiên trong những kết qủa trả về. Nếu không tìm được kết qủa nào, nó sẽ trả về None</li> <li>Query.scalar(): Nó trả về MultipleResultsFound nếu khi thực hiện query, có nhiều hơn 1 kết qủa trả về, và trả về gía trị None khi không có kết qủa nào được trả về. Nó trả về kết qủa nếu chỉ có duy nhất 1 record được tìm thấy khi thực hiện kết qủa query

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí