[Odoo] Thực thi câu lệnh Raw SQL Query trên Odoo


Phần lớn chúng ta thao tác với CSDL PostgreSQL trên Odoo chủ yếu là sử dụng ORM. Nó thực sự rất tiện, cấu trúc cũng rất rõ ràng. Nhưng Odoo ORM không phải là lựa chọn tốt nhất trong 1 số trường hợp nghiệp vụ cụ thể. Thậm chí cùng 1 công việc sử dụng câu lệnh raw sql (câu lệnh nguyên thuỷ) của SQL có thể đem lại hiệu xuất cao hơn. Vậy sử dụng thực thi câu lệnh raw sql trên Odoo như thế nào? Các bạn vui lòng theo dõi bài viết sau trên vinasupport.com

Cú pháp thực hiện raw query trong odoo

Cú pháp để thực thi câu lệnh sql từ một method của model như sau:

self.env.cr.execute("sql_query", param1, param2, param3)

Trong đó

  • sql_query: là câu lệnh SQL của bạn
  • param1, param2 là những đối số truyền vào

VD: Để lấy dữ liệu thông tin nhân viên từ bảng hr_employee chúng ta sử dụng đoạn code như sau:

self.env.cr.execute("SELECT * FROM hr_employee")
employees = self.env.cr.fetchall()

Để trả về dữ liệu chúng ta sử dụng self.env.cr.fetchall()

Bạn có thể tham khảo bài viết này để bật log sql kiểm tra xem câu lệnh SQL đã chạy chưa?

Trường hợp bạn muốn gọi từ Controller thì có thể sử dụng contrỏ cr từ http request.

from odoo.http import request
request.env.cr

Các kiểu fetch dữ liệu raw query trong Odoo

Có 4 loại fetch method để trả về kiểu dữ liệu khi thực hiện câu lệnh SELECT

  1. cr.fetchall(): It will return matching record in the form of a list of tuples Nó sẽ trả về dữ liệu trong 1 list của kiểu tuples
  2. cr.fetchone(): Giống như cr.fetchall() nhưng chỉ trả về 1 record đầu tiên
  3. cr.dictfetchall(): Nó sẽ trả về các dữ liệu trong 1 list các dictionary (key-value)
  4. cr.dictfetchone(): Tương tự như cr.dictfetchall() nhưng chỉ trả về 1 record đầu tiên

Lấy số dòng khi insert, update dữ liệu bằng raw query

Để lấy số record đã được thực hiện khi chúng ta insert hoặc update dữ liệu thì hãy sử dụng cr.rowcount

self.env.cr.execute("UPDATE hr_employee SET name = 'vinasupport.com' WHERE id = %s", 1)
rowcount = self.env.cr.rowcount

Bạn nên đưa các đối số truyền vào ra parameter, tránh ghi trưc tiếp vào câu lệnh SQL. Nó sẽ đảm bảo cho các bạn các đối số đó sẽ qua 1 lớp filter, đảm bảo được bảo mật và chống SQL Injection.

Nguồn vinasupport.com

             
SHARE

Bài viết liên quan

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web