文章

第28天:操作 PostgreSQL 資料庫

操作 PostgreSQL 資料庫在 Python 中可以通過使用 psycopg2 模組進行。這是 Python 中最常用的 PostgreSQL 資料庫接口,支援多種操作,包括查詢、插入、更新、刪除、事務控制等。以下是如何使用 psycopg2 操作 PostgreSQL 的詳細介紹。

1. 安裝 psycopg2

首先安裝 psycopg2 模組:

1
pip install psycopg2

2. 連接到 PostgreSQL 資料庫

在連接資料庫時,需要提供一些基本資訊,如資料庫名稱、用戶名、密碼等。

1
2
3
4
5
6
7
8
9
10
11
12
import psycopg2

# 連接到 PostgreSQL
conn = psycopg2.connect(
    host="localhost",
    database="your_database",
    user="your_username",
    password="your_password"
)

# 建立一個 cursor 物件,操作 SQL 語句
cursor = conn.cursor()

3. 建立資料表

可以使用 SQL 語句來建立資料表,如 CREATE TABLE,並用 cursor.execute 執行。

1
2
3
4
5
6
7
8
9
10
11
# 建立 users 表
create_table_query = '''
CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(50) NOT NULL,
    age INT
);
'''
cursor.execute(create_table_query)
conn.commit()  # 提交變更

4. 插入資料

使用 INSERT INTO 語句插入資料,可以用 %s 佔位符來代入數據,並保護程式免於 SQL 注入攻擊。

1
2
3
4
5
6
insert_query = '''
INSERT INTO users (username, email, age) VALUES (%s, %s, %s);
'''
data = ("Alice", "alice@example.com", 25)
cursor.execute(insert_query, data)
conn.commit()

5. 查詢資料

使用 SELECT 查詢資料,可以透過 fetchallfetchonefetchmany 來獲取結果。

1
2
3
4
5
6
7
8
9
select_query = '''
SELECT * FROM users;
'''
cursor.execute(select_query)
rows = cursor.fetchall()

# 輸出查詢結果
for row in rows:
    print(f"ID: {row[0]}, Username: {row[1]}, Email: {row[2]}, Age: {row[3]}")

6. 更新資料

使用 UPDATE 語句更新資料庫中的記錄。

1
2
3
4
5
update_query = '''
UPDATE users SET age = %s WHERE username = %s;
'''
cursor.execute(update_query, (30, "Alice"))
conn.commit()

7. 刪除資料

使用 DELETE 語句刪除資料庫中的記錄。

1
2
3
4
5
delete_query = '''
DELETE FROM users WHERE username = %s;
'''
cursor.execute(delete_query, ("Alice",))
conn.commit()

8. 使用事務(Transaction)

PostgreSQL 支援事務,因此在進行多次操作時可以使用 conn.rollback() 撤銷變更,確保數據的一致性。

1
2
3
4
5
6
7
8
try:
    cursor.execute("BEGIN;")
    cursor.execute("INSERT INTO users (username, email, age) VALUES (%s, %s, %s);", ("Bob", "bob@example.com", 28))
    cursor.execute("UPDATE users SET age = %s WHERE username = %s;", (29, "Bob"))
    conn.commit()  # 提交事務
except Exception as e:
    conn.rollback()  # 若出現錯誤則撤銷
    print("Transaction failed:", e)

9. 關閉連接

完成操作後,記得關閉 cursor 和資料庫連接。

1
2
cursor.close()
conn.close()

完整範例

以下是一個完整的程式範例,演示如何連接 PostgreSQL 資料庫,並進行建立、插入、查詢、更新和刪除等操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import psycopg2

# 連接資料庫
conn = psycopg2.connect(
    host="localhost",
    database="your_database",
    user="your_username",
    password="your_password"
)

cursor = conn.cursor()

# 建立資料表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(50) NOT NULL,
    age INT
);
''')
conn.commit()

# 插入資料
cursor.execute("INSERT INTO users (username, email, age) VALUES (%s, %s, %s);", ("Alice", "alice@example.com", 25))
conn.commit()

# 查詢資料
cursor.execute("SELECT * FROM users;")
rows = cursor.fetchall()
for row in rows:
    print(row)

# 更新資料
cursor.execute("UPDATE users SET age = %s WHERE username = %s;", (30, "Alice"))
conn.commit()

# 刪除資料
cursor.execute("DELETE FROM users WHERE username = %s;", ("Alice",))
conn.commit()

# 關閉連接
cursor.close()
conn.close()

注意事項

  • 使用佔位符:用 %s 來避免 SQL 注入攻擊。
  • 事務控制:在多步操作中,可以使用 BEGINROLLBACK 控制事務,避免資料不一致。
  • 資源管理:務必在操作完成後關閉 cursor 和 conn,防止資源泄漏。
本文章以 CC BY 4.0 授權