Kết nối PostgreSQL database của Odoo bằng câu lệnh
Tut 15: 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.
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
và \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!
- Khóa học lập trình Odoo TP.HCM: Thông tin và đăng ký khóa học
- Khảo sát nhu cầu học nghiệp vụ Odoo Offline @ HCM & đăng ký sớm: https://forms.gle/auBXLNbfuNqhJSbj8
Cài đặt Odoo:
- Docker Compose for Odoo 10
- Docker Compose for Odoo 11
- Docker Compose for Odoo 12
- Docker Compose for Odoo 13
- Docker Compose for Odoo 14
- Docker Compose for Odoo 15
- Docker Compose for Odoo 16
Danh sách bài viết series Odoo:
- Tut 0: Học lập trình Odoo - tutorials
- Tut 1: Odoo là gì?
- Tut 2: Hướng dẫn cài đặt Odoo version 10, 11, 12, 13
- Tut 3: Tạo model trong Odoo
- Tut 4: View trong Odoo
- Tut 5: Controller trong Odoo
- Tut 6: Thừa kế model trong Odoo
- Tut 7: Thừa kế view trong Odoo
- Tut 8: Thừa kế controller trong Odoo
- Tut 9: API trong Odoo - XML-RPC
- Tut 10: Hiện thực wizard trong Odoo
- Tut 11: Tạo widget trong Odoo
- Tut 12: Tạo settings trong Odoo cho custom addon
- Tut 13: Thêm button cho list/tree view trong Odoo
- Tut 14: Search, Filter, Group By trong Odoo
- Tut 15: Kết nối PostgreSQL database của Odoo bằng câu lệnh
- Tut 16: Kết nối pgAdmin vào PostgreSQL database của Odoo
Tham gia ngay group trên Facebook để cùng thảo luận với đồng bọn nhé:
- Fanpage Minh: https://www.facebook.com/minhng.info
- Khám phá Odoo: https://www.facebook.com/groups/odoo-dev
Khám phá Odoo