Truy cập nhanh giao diện dòng lệnh của PostgreSQL

Để 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, 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" 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õ

$ psql -hlocalhost -Uquan mydatabase
(password)

thì nay ta chỉ cần

$ 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õ

$ 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, 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õ:

$ 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:

$ 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:

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) 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 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 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


Cập nhật

  • Từ phiên bản 13, PostgreSQL có thể tạo Unix domain socket trên Windows.