Trong Odoo, hầu hết chúng ta sử dụng ORM để tương tác với CSDL PostgreSQL. ORM này rất tiện lợi và cấu trúc của nó rất rõ ràng. Tuy nhiên, trong một số trường hợp cụ thể, Odoo ORM không phải lựa chọn tốt nhất. Trong thực tế, có những tình huống mà việc sử dụng câu lệnh SQL nguyên thuỷ (raw SQL) có thể mang lại hiệu suất cao hơn. Vậy làm thế nào để thực hiện thực thi câu lệnh SQL nguyên thuỷ trên Odoo? Hãy theo dõi bài viết sau đây trên Blog để tìm hiểu chi tiết.
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()
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
- 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
- cr.fetchone(): Giống như cr.fetchall() nhưng chỉ trả về 1 record đầu tiên
- cr.dictfetchall(): Nó sẽ trả về các dữ liệu trong 1 list các dictionary (key-value)
- 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.