psql และ pgAdmin
ตอนนี้ที่ PostgreSQL รันอยู่แล้ว คุณต้องมีวิธีสื่อสารกับฐานข้อมูล มีประตูสามบานที่พบบ่อย: shell บน command-line อย่าง psql, เครื่องมือแบบกราฟิกอย่าง pgAdmin และโค้ดแอปพลิเคชันของคุณเองผ่าน driver บทเรียนนี้ครอบคลุมทั้งสามอย่างเพื่อให้คุณเลือกอันที่เหมาะกับช่วงเวลานั้น ๆ ได้
พื้นฐาน psql
หัวข้อที่มีชื่อว่า “พื้นฐาน psql”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 appdbYou are now connected to database "appdb" as user "postgres".appdb=# \dtDid 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
หัวข้อที่มีชื่อว่า “ทัวร์ pgAdmin”หากคุณชอบการคลิกมากกว่าการพิมพ์ pgAdmin คือเครื่องมือแบบกราฟิกอย่างเป็นทางการ และการตั้งค่า Docker จากบทเรียนก่อนหน้าก็มี pgAdmin รันอยู่ที่ http://localhost:8080 แล้ว ต่อไปนี้คือวิธีหาทางไปรอบ ๆ
เมื่อคุณเปิด pgAdmin ครั้งแรก ให้ล็อกอินด้วยอีเมลและรหัสผ่านที่คุณตั้งไว้ในไฟล์ compose ด้านซ้ายแสดง browser tree ที่มีกลุ่ม Servers อยู่ด้านบนสุด หากต้องการเชื่อมต่อกับฐานข้อมูลของคุณ ให้ทำตามขั้นตอนนี้:
- คลิกขวาที่ Servers แล้วเลือกลงทะเบียน server ใหม่
- ในกล่องโต้ตอบ ตั้งชื่อการเชื่อมต่อในแท็บ General
- สลับไปยังแท็บ Connection แล้วกรอก host, port, username และ password
- เนื่องจาก 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 แต่ละตัว
หัวข้อที่มีชื่อว่า “การเชื่อมต่อจาก driver แต่ละตัว”ในโค้ดแอปพลิเคชันคุณเชื่อมต่อผ่าน 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();import { Pool } from 'pg';
const pool = new Pool({ connectionString: 'postgresql://postgres:secret@localhost:5432/appdb',});
const res = await pool.query('SELECT current_database()');console.log(res.rows[0]);import psycopg
conn = psycopg.connect( "postgresql://postgres:secret@localhost:5432/appdb")cur = conn.cursor()cur.execute("SELECT current_database()")print(cur.fetchone())conn, err := pgx.Connect(ctx, "postgresql://postgres:secret@localhost:5432/appdb")if err != nil { return err}defer conn.Close(ctx)let pool = PgPoolOptions::new() .max_connections(5) .connect("postgresql://postgres:secret@localhost:5432/appdb") .await?;สังเกตว่า 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
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
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