Kết nối PostgreSQL database của Odoo bằng câu lệnh

  Jun 18, 2023      2m      0   
 

Tut 15: Kết nối PostgreSQL database của Odoo bằng câu lệnh

Kết nối PostgreSQL database của Odoo bằng câu lệnh

Odoo Tut 15: Kết nối PostgreSQL database của Odoo bằng câu lệnh

Bài viết này sẽ hướng dẫn bạn cách kết nối vào PostgreSQL database của Odoo bằng câu lệnh cho cách triển khai Odoo bằng docker-compose như bài viết: Tut 2: Hướng dẫn cài đặt Odoo version 10, 11, 12, 13, 14, 15, 16. Việc triển khai Odoo bằng docker-compose có nhiều lợi ích:

  • Tính bao đóng của Docker container khiến việc triển khai không ảnh hưởng với các phần mềm cài trên máy chủ.
  • Có khả năng cài đặt nhiều phiên bản Odoo / nhiều instance Odoo trên cùng một máy mà không bị xung đột.
  • Ta có thể backup cả Odoo và database PostgreSQL bằng cách copy / zip lưu trữ toàn bộ folder trên đĩa.

Thông thường, khi lập trình Odoo ta làm việc với model (Tut 3: Tạo model trong Odoo). ORM của Odoo sẽ tự động tạo và binding Python class với một bảng (table) trong cơ sở dữ liệu quan hệ PostgreSQL. Minh thường khuyến khích mọi người làm việc với model của Odoo thay vì tác động trực tiếp vào database. Đôi khi, có một vài trường hợp cá biệt mà việc query database sẽ nhanh và hiệu quả hơn so với ORM, Minh liệt kê một vài tình huống sau đây:

  • Chỉnh sửa dữ liệu: tác vụ cần chỉnh sửa ở đây diễn ra không thường xuyên trên một vài mẫu dữ liệu hoặc hàng loạt dữ liệu theo một quy luật nào đó => nếu làm ở model trong Odoo sẽ cồng kềnh hơn vì ta phải viết một method trong class và tìm cách trigger nó (thông qua cron schedule action hoặc nút bấm)
  • Xóa dữ liệu: do tính chất ERP yêu cầu mà một số transaction đã diễn ra sẽ không thể chỉnh sửa hoặc xóa (do một số ràng buộc với record khác), việc kết nối trực tiếp vào database thao tác xóa sẽ bypass các ràng buộc này => lưu ý: bạn phải hiểu rõ việc xóa record trong database sẽ ảnh hưởng như thế nào và bạn phải kiểm soát được nó thì mới nên làm.
  • Cập nhật lại mật khẩu admin: đôi khi ta sẽ quên mất mật khẩu tài khoản admin nếu lâu quá không sử dụng hoặc không ghi chú vào một nơi nào đó. Nếu không có tài khoản admin dự phòng nào khác bạn sẽ không thể set lại mật khẩu người dùng. Khi đó ta có thể kết nối vào database (biết thông tin kết nối database) để set lại mật khẩu. Tham khảo: How to Reset the Odoo Admin User Password: A Summary for different Odoo Versions

Kết nối vào PostgreSQL container

Đầu tiên, bạn gõ lệnh docker ps để liệt kê ra các docker container đang chạy để tìm ra database của Odoo. Trong trường hợp của mình tên container database của Odoo là ffm_lvt_production-db-1, mình sẽ dùng tên này ở lệnh sau.

docker ps

Sau đó, ta thực kết nối vào bên trong container database này bằng lệnh docker exec -it <TÊN DOCKER CONTAINER> bash:

$ docker exec -it ffm_lvt_production-db-1 bash

root@382c79db76ce:/#

Khi đã vào được bash bên trong container database của Odoo ta dùng client psql để kết nối đến database.

Kết nối vào PostgreSQL Database

Đang ở bên trong container, ta thử tra cứu các tham số của psql bằng lệnh psql --help

psql is the PostgreSQL interactive terminal.

Usage:
  psql [OPTION]... [DBNAME [USERNAME]]

General options:
  -c, --command=COMMAND    run only single command (SQL or internal) and exit
  -d, --dbname=DBNAME      database name to connect to (default: "root")
  -f, --file=FILENAME      execute commands from file, then exit
  -l, --list               list available databases, then exit
  -v, --set=, --variable=NAME=VALUE
                           set psql variable NAME to VALUE
                           (e.g., -v ON_ERROR_STOP=1)
  -V, --version            output version information, then exit
  -X, --no-psqlrc          do not read startup file (~/.psqlrc)
  -1 ("one"), --single-transaction
                           execute as a single transaction (if non-interactive)
  -?, --help[=options]     show this help, then exit
      --help=commands      list backslash commands, then exit
      --help=variables     list special variables, then exit

Input and output options:
  -a, --echo-all           echo all input from script
  -b, --echo-errors        echo failed commands
  -e, --echo-queries       echo commands sent to server
  -E, --echo-hidden        display queries that internal commands generate
  -L, --log-file=FILENAME  send session log to file
  -n, --no-readline        disable enhanced command line editing (readline)
  -o, --output=FILENAME    send query results to file (or |pipe)
  -q, --quiet              run quietly (no messages, only query output)
  -s, --single-step        single-step mode (confirm each query)
  -S, --single-line        single-line mode (end of line terminates SQL command)

Output format options:
  -A, --no-align           unaligned table output mode
      --csv                CSV (Comma-Separated Values) table output mode
  -F, --field-separator=STRING
                           field separator for unaligned output (default: "|")
  -H, --html               HTML table output mode
  -P, --pset=VAR[=ARG]     set printing option VAR to ARG (see \pset command)
  -R, --record-separator=STRING
                           record separator for unaligned output (default: newline)
  -t, --tuples-only        print rows only
  -T, --table-attr=TEXT    set HTML table tag attributes (e.g., width, border)
  -x, --expanded           turn on expanded table output
  -z, --field-separator-zero
                           set field separator for unaligned output to zero byte
  -0, --record-separator-zero
                           set record separator for unaligned output to zero byte

Connection options:
  -h, --host=HOSTNAME      database server host or socket directory (default: "local socket")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name (default: "root")
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)

For more information, type "\?" (for internal commands) or "\help" (for SQL
commands) from within psql, or consult the psql section in the PostgreSQL
documentation.

Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>

Một số parameter quan trọng của psql gồm:

  • host: địa chỉ của database server
  • port: cổng của database server (mặc định: 5432)
  • username: tên user
  • password: mật khẩu đăng nhập của user này vào database
  • dbname: tên database => mặc định sẽ có một database postgres

Lưu ý: do ta terminal ta đang ở bên trong container chạy PostgreSQL database server, nên ta sẽ nhìn thấy db host với địa chỉ IP là 0.0.0.0 và db port mặc định là 5432 cho dù bên ngoài nhìn chúng với IP và port khác!

Các thông số để kết nối vào database mình đã đặc tả trong file docker-compose. Ví dụ: https://github.com/minhng92/odoo-16-docker-compose/blob/master/docker-compose.yml#L8

Tiếp theo ta thực hiện kết nối vào PostgreSQL database server:

psql --host=0.0.0.0 --port=5432 --username=odoo --dbname=postgres

###### Kết nối thành công terminal sẽ in ra như sau: ######
psql (13.8 (Debian 13.8-1.pgdg110+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

Lưu ý: nếu bạn theo lệnh trên mà bị hỏi mật khẩu thì bạn điền mật khẩu đã cấu hình cho PostgreSQL container như trong file docker-compose mà bạn triển khai.

Với lệnh trên bạn đã kết nối vào database NHƯNG chúng ta đang ở database mặc định là "postgres", để liệt kê và kết nối đến database Odoo dùng thì ta dùng lệnh \list\connect. Bạn xem ví dụ sau:

\list

                               List of databases
     Name     | Owner | Encoding |  Collate   |   Ctype    | Access privileges 
--------------+-------+----------+------------+------------+-------------------
 ffm_lvt_prod | odoo  | UTF8     | C          | en_US.utf8 | 
 postgres     | odoo  | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0    | odoo  | UTF8     | en_US.utf8 | en_US.utf8 | =c/odoo          +
              |       |          |            |            | odoo=CTc/odoo
 template1    | odoo  | UTF8     | en_US.utf8 | en_US.utf8 | =c/odoo          +
              |       |          |            |            | odoo=CTc/odoo
(4 rows)

#### --------------------------------------------------- ####
#### database của Odoo ta cần kết nối tên "ffm_lvt_prod" ####
#### vì vậy ta thực hiện kết nối đến nó                  ####
#### --------------------------------------------------- ####

\connect ffm_lvt_prod

SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "ffm_lvt_prod" as user "odoo".
ffm_lvt_prod=#

Lúc này ta đã kết nối được vào PostgreSQL database của Odoo, ta có thể liệt kê danh sách bảng bằng lệnh \dt

\dt

                                   List of relations
 Schema |                              Name                               | Type  | Owner 
--------+-----------------------------------------------------------------+-------+-------
 public | account_account                                                 | table | odoo
 public | account_account_account_journal_rel                             | table | odoo
 public | account_account_account_tag                                     | table | odoo
 public | account_account_tag                                             | table | odoo
 public | account_account_tag_account_move_line_rel                       | table | odoo
 public | account_account_tag_account_tax_repartition_line_rel            | table | odoo
 public | account_account_tax_default_rel                                 | table | odoo
 ...
 ...
 ...

Hoặc chạy truy vấn SQL:

select * from pos_order limit 2;

   id   |       name        |     date_order      | user_id | amount_tax | amount_total | amount_paid | amount_return | company_id | pricelist_id |
 partner_id | sequence_number | session_id | currency_rate | state | account_move | note | nb_print |    pos_reference     | sale_journal | fiscal_
position_id | to_invoice | is_tipped | tip_amount | create_uid |        create_date         | write_uid |         write_date         | rating | emp
loyee_id |          cashier          | mode_points | family_split | wk_loyalty_points | credit_points | debit_points | table_id | customer_count | 
multiprint_resume | returned_order_id | return_reason | payment_method_id | is_today |            ulid            | gid |      sync_date      | crm
_team_id 
--------+-------------------+---------------------+---------+------------+--------------+-------------+---------------+------------+--------------+
------------+-----------------+------------+---------------+-------+--------------+------+----------+----------------------+--------------+--------
------------+------------+-----------+------------+------------+----------------------------+-----------+----------------------------+--------+----
---------+---------------------------+-------------+--------------+-------------------+---------------+--------------+----------+----------------+-
------------------+-------------------+---------------+-------------------+----------+----------------------------+-----+---------------------+----
---------
 389726 | POS2/132290       | 2023-03-17 03:15:57 |      15 |     7110.0 |      78000.0 |     78000.0 |      122000.0 |          1 |            4 |
       5228 |              36 |       5629 |           1.0 | done  |              |      |        0 | Order 05629-001-0036 |           10 |        
            | f          | f         |        0.0 |         15 | 2023-03-17 03:15:57.706766 |        15 | 2023-03-17 07:26:15.380031 | 0      |    
      57 | Cashier44-Khiếu Cẩm Ly    | my          | []           |                58 |            78 |           20 |          |              1 | 
                  |                   |               |                 1 | t        | 01GVPS296ZH6EXZBPBPPEJ6V3T |  -1 | 2023-03-17 03:15:57 |    
        
 396864 | POS3-Backup/53091 | 2023-03-23 11:18:10 |      16 |     4714.0 |      80000.0 |     80000.0 |      420000.0 |          1 |            4 |
       9949 |             107 |       5685 |           1.0 | done  |              |      |        0 | Order 05685-002-0107 |           10 |        
            | f          | f         |        0.0 |         16 | 2023-03-23 11:18:10.765057 |        16 | 2023-03-23 15:04:24.668073 | 0      |    
      63 | Cashier49-Đặng Thúy Quyên | my          | []           |               547 |            80 |          627 |          |              1 | 
                  |                   |               |                 1 | t        | 01GW731J4XH9EEFY7FAVZ4EB53 |  -1 | 2023-03-23 11:18:10 |    
        
(2 rows)

Ghi chú: để thoát terminal trong database hoặc trong docker container ta nhất tổ hợp phím Ctrl + d

Từ lúc này trở đi, ta có thể thoải mái thực hiện các câu truy vấn SQL để thao tác dữ liệu. Việc truy vấn trực tiếp làm ảnh hưởng database của Odoo tiềm ẩn nhiều rủi ro, bạn phải cẩn thận hoặc thực hiện backup trước khi thực hiện các câu truy vấn SQL này!


Cài đặt Odoo:

Danh sách bài viết series Odoo:

Tham gia ngay group trên Facebook để cùng thảo luận với đồng bọn nhé:

Khám phá Odoo


Khám phá xử lý ảnh - GVGroup




-->