ข้ามไปยังเนื้อหา

psql และ pgAdmin

ตอนนี้ที่ PostgreSQL รันอยู่แล้ว คุณต้องมีวิธีสื่อสารกับฐานข้อมูล มีประตูสามบานที่พบบ่อย: shell บน command-line อย่าง psql, เครื่องมือแบบกราฟิกอย่าง pgAdmin และโค้ดแอปพลิเคชันของคุณเองผ่าน driver บทเรียนนี้ครอบคลุมทั้งสามอย่างเพื่อให้คุณเลือกอันที่เหมาะกับช่วงเวลานั้น ๆ ได้

psql คือ terminal client อย่างเป็นทางการ เมื่อเชื่อมต่อแล้ว คุณพิมพ์ SQL ได้โดยตรง แต่ของดีจริง ๆ คือ meta-command — คำสั่งสั้น ๆ ที่ขึ้นต้นด้วย backslash และตรวจสอบฐานข้อมูลให้คุณ ต่อไปนี้คือคำสั่งที่คุณจะใช้อยู่ตลอดเวลา

คำสั่งทำอะไร
\lแสดงรายการฐานข้อมูลทั้งหมดใน server
\c dbnameเชื่อมต่อกับฐานข้อมูลอื่น
\dtแสดงรายการ table ในฐานข้อมูลปัจจุบัน
\d tablenameอธิบาย column, type และ constraint ของ table
\qออกจาก psql

session แรกทั่วไปจะมีลักษณะแบบนี้ คุณเชื่อมต่อ มองไปรอบ ๆ รัน query แล้วออก

postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype
-----------+----------+----------+-------------+----------
appdb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8
(2 rows)
postgres=# \c appdb
You are now connected to database "appdb" as user "postgres".
appdb=# \dt
Did not find any relations.
appdb=# SELECT 1 + 1 AS answer;
answer
--------
2
(1 row)
appdb=# \q

การรัน SQL ก็แค่พิมพ์ statement แล้วปิดท้ายด้วยเครื่องหมายอัฒภาค meta-command ช่วยให้คุณไม่ต้องท่องจำ system query ที่อยู่เบื้องหลัง \l, \dt และผองเพื่อน — เพราะรัน query เหล่านั้นให้แล้วจัดรูปแบบผลลัพธ์มาให้เสร็จ

หากคุณชอบการคลิกมากกว่าการพิมพ์ pgAdmin คือเครื่องมือแบบกราฟิกอย่างเป็นทางการ และการตั้งค่า Docker จากบทเรียนก่อนหน้าก็มี pgAdmin รันอยู่ที่ http://localhost:8080 แล้ว ต่อไปนี้คือวิธีหาทางไปรอบ ๆ

เมื่อคุณเปิด pgAdmin ครั้งแรก ให้ล็อกอินด้วยอีเมลและรหัสผ่านที่คุณตั้งไว้ในไฟล์ compose ด้านซ้ายแสดง browser tree ที่มีกลุ่ม Servers อยู่ด้านบนสุด หากต้องการเชื่อมต่อกับฐานข้อมูลของคุณ ให้ทำตามขั้นตอนนี้:

  1. คลิกขวาที่ Servers แล้วเลือกลงทะเบียน server ใหม่
  2. ในกล่องโต้ตอบ ตั้งชื่อการเชื่อมต่อในแท็บ General
  3. สลับไปยังแท็บ Connection แล้วกรอก host, port, username และ password
  4. เนื่องจาก pgAdmin รันใน container ของตัวเอง host จึงเป็นชื่อ service postgres แทนที่จะเป็น localhost ส่วน port ยังคงเป็น 5432 และ user คือ postgres

เมื่อเชื่อมต่อแล้ว tree จะขยายออก เปิด server ของคุณ จากนั้น Databases จากนั้นฐานข้อมูลหนึ่ง จากนั้น Schemas จากนั้น schema public และสุดท้าย Tables การซ้อนกันนี้สะท้อนวิธีที่ PostgreSQL จัดระเบียบข้อมูลจริง ๆ ซึ่งบทเรียนถัดไปจะอธิบายในรายละเอียด คลิก object ไหนก็ได้ แล้วรายละเอียดจะขึ้นใน panel หลัก

ตัวหลักคือ Query Tool ที่เปิดจาก toolbar หรือโดยการคลิกขวาที่ฐานข้อมูล ตัวนี้ให้ SQL editor ที่คุณพิมพ์ statement แล้วกดปุ่มรันได้เลย ผลลัพธ์ปรากฏใน grid ด้านล่าง และข้อความเช่นจำนวน row แสดงในแท็บแยกต่างหาก หากต้องการเรียกดูเนื้อหาของ table โดยไม่ต้องเขียน SQL ให้คลิกขวาที่ table แล้วเลือกดู row ของ table นั้น ซึ่งจะเปิด grid เดียวกันที่เติม SELECT ไว้ล่วงหน้า

หาก pgAdmin รู้สึกหนักเกินไป DBeaver เป็นทางเลือกฟรียอดนิยม — แอปพลิเคชันบนเดสก์ท็อปที่เชื่อมต่อกับ PostgreSQL และฐานข้อมูลอื่น ๆ อีกมากมายด้วยเลย์เอาต์แบบ tree-and-editor ที่คล้ายกัน แนวคิดถ่ายโอนกันได้โดยตรง เพียงเมนูเท่านั้นที่ต่างกัน

ในโค้ดแอปพลิเคชันคุณเชื่อมต่อผ่าน driver — library ที่พูดภาษา protocol ของ PostgreSQL รายละเอียดการเชื่อมต่อเป็นชุดเดียวกับที่คุณใช้ข้างต้น เพียง syntax เท่านั้นที่เปลี่ยนไป ต่อไปนี้คือวิธีที่ driver แต่ละตัวเปิดการเชื่อมต่อ

-- psql takes the connection string on the command line:
-- psql "postgresql://postgres:secret@localhost:5432/appdb"
SELECT current_database();

สังเกตว่า driver ทุกตัวรับ connection string postgresql://user:password@host:port/database แบบเดียวกัน เรียนรู้รูปแบบนั้นเพียงรูปแบบเดียวแล้วคุณก็เชื่อมต่อจากที่ไหนก็ได้

ใน pgAdmin: รายละเอียดการเชื่อมต่อเดียวกันนี้อยู่ในกล่องโต้ตอบลงทะเบียน server แทนที่จะเป็น string — host, port, user, password และ database ต่างมีช่องของตัวเอง

  • connection string เป็นไปตามรูปแบบ postgresql://user:password@host:port/database แต่ละส่วนเป็น optional เมื่อมีค่า default ใช้แทน
  • จากภายใน container อื่น (เช่น pgAdmin) host คือชื่อ service ไม่ใช่ localhost ส่วนจากเครื่องของคุณเองให้ใช้ localhost
  • ใช้ psql สำหรับการตรวจสอบอย่างรวดเร็วและการเขียน script, GUI อย่าง pgAdmin หรือ DBeaver สำหรับการเรียกดูและสำรวจ และ driver สำหรับสิ่งใด ๆ ที่แอปพลิเคชันของคุณทำซ้ำ ๆ
  • อย่า hard-code รหัสผ่านในโค้ดที่ commit ไป อ่าน connection string จากตัวแปร environment ในโปรเจกต์จริง
  • กลุ่ม meta-command \d เป็นวิธีที่เร็วที่สุดในการจำรูปทรงที่แน่นอนของ table โดยไม่ต้องออกจาก shell
ตัวเลือกBenefitCost
psql CLIเร็ว, script ได้, overhead ต่ำต้องจำ meta-command และ syntax
pgAdmin GUIเห็นโครงสร้างข้อมูลชัดเจน เหมาะกับมือใหม่หนักกว่า และต้องมีเครื่อง desktop เปิด browser
Driver ในโค้ดแอปคือของจริงที่ production ใช้รันทุกวันต้องเขียนโค้ดเพิ่มแค่เพื่อ query อย่างเดียวไม่คุ้ม
  • พึ่ง GUI อย่างเดียวแล้วไม่เคยเรียน meta-command — เวลาต้อง SSH เข้า production ที่ไม่มี GUI ให้ใช้ คุณจะติดขัดทันทีถ้าไม่คุ้นกับ \dt, \d และผองเพื่อน
  • ลืมว่า pgAdmin/DBeaver เชื่อมด้วยชื่อ host ของ container network ไม่ใช่ localhost — จากเครื่อง host คุณใช้ localhost ได้ แต่จาก container อื่นต้องใช้ชื่อ service เช่น postgres ตามที่ compose ตั้งไว้
  • copy-paste SQL ข้ามเครื่องมือโดยไม่เช็คสถานะ transaction — psql กับ GUI บางตัวจัดการ autocommit ต่างกัน การ copy query ที่มี BEGIN/COMMIT ข้ามเครื่องมืออาจทำให้ transaction ค้างโดยไม่รู้ตัว

💡 ตัวอย่างจากของจริง

ทีม backend ส่วนใหญ่ — ใช้ psql สำหรับ debug production อย่างรวดเร็วผ่าน SSH เพราะ server จริงมักไม่มี GUI ให้ใช้

นักวิเคราะห์ข้อมูล (data analyst) — ใช้ pgAdmin หรือ DBeaver เป็นหลักสำหรับงานสำรวจข้อมูลแบบ exploratory เพราะเห็นโครงสร้าง table และผลลัพธ์เป็น grid ได้ทันที ไม่ต้องจำ syntax

meta-command ของ psql ตัวใดแสดงรายการ table ในฐานข้อมูลปัจจุบัน?
รูปแบบมาตรฐานของ connection string ของ PostgreSQL คืออะไร?
จาก container ของ pgAdmin คุณควรใช้ชื่อ host ใดในการเข้าถึง service ฐานข้อมูล?