คู่มือเอาตัวรอด :การใช้งาน PostgreSQL ผ่าน command line
Published: 2024-07-12 09:48:14

**บทนำ**
เคยไหม! ช่วงบ่าย 2 ในห้วงเวลาปลายเดือน ในขณะที่คุณกำลังจะเคลิ้มหลับเนื่องจากฤิทธิ์ข้าวเหนียวหมูปิ้งเมื่อมื้อกลางวัน เสียงโทรศัพท์จากหัวหน้า HR ปลุกวิญญาณให้ตื่นจากภวัง
ทาง HR แจ้งว่าไม่สามารถเข้าถึงข้อมูลพนักงานเพื่อที่จะคำนวณเงินเดือนของเดือนนี้ต้องการข้อมูลก่อนเลิกงาน เอาละสิจากพนักงานธรรมดากลายเป็นควมหวังของหมู่บ้านได้ทีนี้มีทางเลือกอะไรบ้าง
- เปิดจาก Application ไม่สามารถเชื่อมต่อ database ได้
- ติดตั้ง Database Management Application พวก pgAdmin , DBeaver, Navicat etc. ปรากฏว่า ขึ้นไม่สามารถเชื่อมต่อฐานข้อมูลได้
- ping ดูว่า server ไหม? ไม่ล่มแล้วไป เลยทดสอบ telnet (โบราณไป..) ssh ไปยัง server พบแต่หน้าจอดำๆ กับพิมพ์ได้อย่างเดียว แล้วไงต่อ การใช้ command line คือทางออก

**psql คืออะไร**  
เป็นโปรแกรมสำหรับโต้ตอบกับฐานข้อมูล PostgreSQL   โดยใช้คำสั่ง SQL 

**การใช้งาน**

เข้าใช้งานด้วยคำสั่ง
```bash
$psql -U <username> -d <database> -W
```
เมื่อ
- username: ชื่อผู้ใช้งานใน postgres
- database: ชื่อฐานข้อมูลที่ต้องการเชื่อมต่อ

>**<u>Tips</u>** พารามิเตอร์ที่เกี่ยวกับการเชื่อมต่อ
>-h, --host=HOSTNAME: database server host or socket directory (ค่าเริ่มต้น: "local socket")
>  -d, --dbname=DBNAME: ฐานข้อมูลที่ต้องการเชื่อม(default: "root")
>  -p, --port=PORT:port ที่ใช้ในการเชื่อมต่อ (ค่าเริ่มต้น: "5432")
>  -U, --username=USERNAME:  ชื่อผู้ใช้งาน (ค่าเริ่มต้น: "root")
>  -w, --no-password:ไม่ให้ขึ้น prompt ในการป้อนรหัสผ่าน
>  -W, --password: กำหนดให้ขึ้น prompt ในการป้อนรหัสผ่าน(ควรเกิดขึ้นอัติโนมัติ)
เมื่อเข้าสำเร็จจะแสดง prompt ของ postgres
```bash
postgres=# 
```
ที่ postgres prompt ให้พิมพ์คำสั่ง
- \l ดู database ทั้งหมด

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlj9myv5uj5bv25g9p51.png)
- \c <ชื่อฐานข้อมูล> เข้าใช้งานฐานข้อมูลที่ต้องการ

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3klbmyp7ycogpvwyyqm.png)
จะเปลี่ยนเป็น prompt เป็นชื่อฐานข้อมูลนั้น โดยเมื่ออยู่ใน prompt ของฐานข้อมูลแล้วเราสามารถใช้คำสั่ง SQL ในการจัดการข้อมูลในฐานข้อมูลนั้นได้ปรกติ   
- \dt ดู table ทั้งหมดใน database ปัจจุบัน

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pgl1hs8oyeb4bjqmtdku.png)
- \dt+ ดู size และ description ของ table เพิ่มเติม

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nlsck2otniyfl4th6o3i.png)
- \d <ชื่อตาราง> ดูโครงสร้างของตารางตามที่กำหนด

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75vr7bbwoj74ucxpblkp.png)
- \dv ดู view ทั้งหมด
- \df ดู function ทั้งหมด

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tq3otfn6p9t6l78d9jkk.png)
- \dx ดู extension ที่ติดตั้งทั้งหมด

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6hqifmxf45sabry8p1ce.png)
- \du ดู user ทั้งหมด

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bh9xgelffj1b4lglc7x.png)
- \e ทำการเปิด editor เพื่อแก้ไข command(ต้องมีการกำหนดค่า$EDITOR environment variable)
- \s <ชื่อไฟล์> บันทึก comand ลง file ตามชื่อที่กำหนด
- \! clear สำหรับ clear หน้าจอ
- \h => Help
- \? ดูว่ามี command อะไรให้ใช้งานบ้าง
- \q ออก เลิกใช้งาน …

>**<u>หมายเหตุ</u>**
>กรณีที่เราใช้ \c ในการเข้า prompt ของฐานข้อมูลคำสั่งต่างๆ จะแสดงรายการเฉพาะฐานข้อมูลที่เลือก ในกรณีที่ยังไม่กำหนดฐานข้อมูลจะแสดงข้อมูลรายการของทั้ง postgres server

**แถมท้าย**
เราสามารถดึงข้อมูลพร้อมexport เป็นไฟล์ CSV ให้หัวหน้า HR นำไปใช้งานต่อ(เย้..เลิกงานพอดีและวันนี้ต้องมีคนทำ otและมีตรได้ฉลองเงินเดือนออก)  

```sql
COPY (SELECT * FROM foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
```


***บทส่งท้าย***
command line เป็นเครื่องมือในการจัดการฐานข้อมูลซึ่งไม่ได้มีเฉพาะใน postgres เท่านั้นฐานข้อมูลอื่นๆ ส่วนมี command line ในการบริหารจัดการฐานข้อมูลได้การที่เราสามารถใช้งานได้จะช่วยเพิ่มทางเลือกในการแก้ปัญหามากขึ้น นอกจากนี้เวลาผู้ใช้เห็นเราใช้ command line แก้ปัญหาจะทำให้ดูหล่อ ประดุจ hacker ในหนังแนวอาชญากรรมทางไซเบอร์ฏ็ไม่ปาน