--- title: Truy cập nhanh giao diện dòng lệnh của PostgreSQL date: 2015-10-14 00:49:02.729061 UTC --- Để truy cập vào một hệ sơ sở dữ liệu (CSDL), ta luôn cần 3 thông số: địa chỉ server, username và password. Sẽ không là vấn đề khi một chương trình được cấu hình tự động để truy cập vào hệ CSDL, nhưng nhiều khi ta phải kết nối vào giao diện dòng lệnh, để tự tay làm một số việc với dữ liệu, và phải đối mặt với sự phiền hà của việc tìm lại và khai báo username, password. Username có thể dễ hơn vì ta thường đặt một username dễ nhớ, nhưng password thì luôn phải rắc rối và thường ta không thể nhớ được, phải cất đâu đó. Đã phải mất công tìm kiếm, mà tự tay gõ cũng phiền nữa. Thế nhưng với [PostgreSQL](http://www.postgresql.org/), ta có một mẹo để làm việc này nhẹ nhàng hơn. PostgreSQL cho phép ["gắn kết"](https://www.postgresql.org/docs/12/tutorial-createdb.html) một tài khoản user trong nó với tài khoản user của hệ điều hành. Ví dụ trên hệ điều hành (Linux, Unix) ta có user _quan_ và trong PostgreSQL ta tạo một user (role) cũng tên _quan_, thì khi ta đang đăng nhập vào hệ điều hành dưới user _quan_, ta có thể truy cập ngay lập tức vào PostgreSQL dưới role _quan_ mà không cần đăng nhập, tức là không phải khai báo hostname, username và password. Thay vì ta phải gõ ```console $ psql -hlocalhost -Uquan mydatabase (password) ``` thì nay ta chỉ cần ```console $ psql mydatabase ``` Trong trường hợp ta phải làm một số việc thuộc quyền quản trị như tạo database, tạo user, ta cần phải đăng nhập với tư cách một user có quyền cao hơn, thông thường là user _postgres_, ta cũng không cần tới password của user này. Ta chỉ cần gõ ```console $ sudo -u postgres psql ``` và nhập password của ta (user _quan_ trên hệ điều hành). Khi PostgreSQL được cài vào máy, nó sẽ được tạo một user có tên _postgres_ trên hệ điều hành, ứng với user cấp cao cùng tên trong hệ CSDL. Đối với [Ubuntu](http://www.ubuntu.com/), user này mặc định **không có password**, tương tự như _root_. Cho nên, khi dùng mẹo phía trên, ta tiết kiệm được 2 việc: - Tạo password cho _postgres_ - Cất giữ, lục tìm và gõ password cho _postgres_ Nói đến việc không có password, tôi cũng thích sử dụng CSDL với một tài khoản không có password, vừa đỡ phải tìm cách giấu giếm, lưu trữ, vừa khỏi lo bị lộ (vì có tồn tại đâu mà lộ). PostgeSQL lại cung cấp những dòng lệnh để ta tạo tài khoản và database rất nhanh, rất thân thiện với người dùng Linux. Ví dụ khi mới cài PostgreSQL, việc đầu tiên tôi làm chỉ là mở Terminal và gõ: ```console $ sudo -u postgres createuser -s $USER $ createdb my_project ``` Lệnh thứ nhất là để tạo một user trong Postgres trùng tên với user hệ điều hành, để có thể kết nối nhanh qua Unix socket (`-s` là để cấp quyền _superuser_). Lệnh thứ hai là để tạo một database có tên *my_project* và đặt "owner" là chính tôi (user _quan_ sẽ có toàn quyền trên database đó). Những lệnh này rất ngắn gọn, có thể "tab-complete", dễ thực hiện hơn việc chạy những câu lệnh SQL dài dòng. Trong lệnh thứ nhất, tôi dùng với option `-s` để tạo superuser, nếu chỉ tạo user thường thì ở lệnh thứ hai phải đổi thành: ```console $ sudo -u postgres createdb my_project -O $USER ``` Khi sử dụng PostgreSQL trong những ứng dụng khác, ta cũng có thể khai thác tính năng này để viết cấu hình ngắn gọn hơn, ví dụ khi làm web với Django: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabasename', } } ``` Ta chỉ cần khai báo `NAME`, bỏ qua hết `USER`, `PASSWORD`, `PORT`, thậm chí là `HOST`. Khi sử dụng với một thư viện nào chấp nhận cấu hình CSDL dạng URL (như [SQLAlchemy](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls)) thì ta có thể sử dụng URL hết sức ngắn gọn như: `postgres:///mydatabasename`. Đây là hai trong những lí do tôi thích PostgreSQL hơn MySQL. Đa số những lập trình viên tôi biết thường học và làm quen với một hệ CSDL nào đó trước khi chuyển qua PostgreSQL, nên không biết đến tính năng này của Postgres. Khi họ chuyển qua PostgreSQL, họ đã quen thủ tục đăng nhập, cho là bước đơn giản nên không lưu tâm xem PostgreSQL có cung cấp cách làm nào khác hơn. Mẹo này cũng chỉ áp dụng được trên các hệ điều hành Linux (bất kể họ Debian/Ubuntu hay Fedora, ArchLinux...), không áp dụng được trên Windows. Chuyên sâu hơn chút: - Không nên nhầm lẫn cách xác thực này với chế độ "trust". Nhiều bạn mới động tay vào PostgreSQL thường lúng túng trong việc kết nối, tạo CSDL và thường tìm hướng dẫn trên StackOverflow. Tuy nhiên có một câu trả lời phổ biến trên StackOverlow rất bậy bạ khi bày người đọc vào sửa cấu hình PostgreSQL, đổi chế độ xác thực về "trust". Trên các HĐH Linux, khi mới cài PostgreSQL bằng phương pháp chuẩn (qua package manager) thì cấu hình mặc định của PostgreSQL đã cho phép xác thực "không password" rồi mà không cần sửa thành "trust". - Trong phương pháp kết nối này, PostgreSQL vẫn xác thực người dùng chứ không phải "nhắm mắt nhận đại". Khả năng này có được là nhờ một thuộc tính đặc biệt của socket trên Linux, tên là `SO_PEERCRED`. - Một số hệ điều hành hậu duệ của Unix cũng có tính năng tương tự `SO_PEERCRED`. Ta có thể theo dõi [source code](https://github.com/postgres/postgres/blob/REL_13_0/src/port/getpeereid.c#L35) của PostgreSQL để biết nó có khai thác tính năng này trên những HĐH nào. - MySQL cũng có khả năng xác thực "peer" nhưng tính năng này không có sẵn, nó được cung cấp qua [plugin](https://dev.mysql.com/doc/refman/8.0/en/socket-pluggable-authentication.html) và mặc định thì plugin này không được kích hoạt. Thêm một ghi chú nhỏ: Nếu bạn thường xuyên phải thao tác dòng lệnh với PostgreSQL, hãy xem qua công cụ _pgcli_ tại http://pgcli.com. Công cụ này được viết bằng Python. Dưới đây là một tấm ảnh tóm tắt tiện ích mà _pgcli_ mang lại: ![pgcli](https://pgcli.com/images/image01.png) --- ### Cập nhật - Từ phiên bản 13, PostgreSQL có thể tạo Unix domain socket [trên Windows](https://www.postgresql.org/docs/current/release-13.html#id-1.11.6.6.5).