Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wordpress-seo domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/vinascript/html/wp-includes/functions.php on line 6114
Thực thi câu lệnh Raw SQL Query trên Odoo - VinaScript

Latest Post

Triển khai dự án PHP, Mysql với Nginx trên Docker Tìm hiểu về HTML – Ưu điểm, nhược điểm và cách hoạt động của HTML

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

  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.

Để lại một bình luậ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 *