---
# System prepended metadata

title: SQL Server 2022 CRUD
tags: [Python]

---

## CRUD

要對 SQL Server 進行 CRUD（Create, Read, Update, Delete）操作，你可以使用 Python 中的 pyodbc 庫來與 SQL Server 進行交互。以下是一個簡單的示例，展示了如何使用 pyodbc 庫來執行 CRUD 操作：

```python=
import pyodbc

# 連接到 SQL Server
conn = pyodbc.connect(
    # "Driver={SQL Server Native Client 11.0};"
    "Driver={SQL Server};"
    "Server=server_name;"
    "Database=database_name;"
    "UID=username;"
    "PWD=password;"
)

# 創建
def create_record():
    cursor = conn.cursor()
    cursor.execute("INSERT INTO table_name (column1, column2) VALUES (?, ?)", value1, value2)
    conn.commit()
    cursor.close()

# 讀取
def read_records():
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM table_name")
    rows = cursor.fetchall()
    for row in rows:
        # 處理每一行的數據
        print(row)
    cursor.close()

# 更新
def update_record(record_id, new_value):
    cursor = conn.cursor()
    cursor.execute("UPDATE table_name SET column1 = ? WHERE id = ?", new_value, record_id)
    conn.commit()
    cursor.close()

# 刪除
def delete_record(record_id):
    cursor = conn.cursor()
    cursor.execute("DELETE FROM table_name WHERE id = ?", record_id)
    conn.commit()
    cursor.close()

# 執行操作
create_record()
read_records()
update_record(1, "new_value")
delete_record(1)

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

在上述示例中，你需要根據你的 SQL Server 信息設置連接字串中的 `server_name`、`database_name`、`username` 和 `password`。然後，你可以使用 `pyodbc.connect()` 函數建立與 SQL Server 的連接。接下來，你可以定義創建、讀取、更新和刪除的函數來執行相應的操作。最後，你需要在操作之後關閉連接。

請注意，上述示例中使用的是 pyodbc 庫，你需要確保已經安裝了該庫，可以使用 `pip install pyodbc` 命令進行安裝。另外，請根據你的具體情況自行修改表名、列名和 SQL 語句等部分。

### Select / Handle Row

在 pyodbc 中，使用 fetch 方法獲取的每一個 Row 都是一個 tuple，你可以使用索引或欄位名稱來獲取該 Row 中的欄位值。

使用索引：

```python=
row = cursor.fetchone()  # 獲取一個 Row
value = row[0]  # 使用索引 0 獲取第一個欄位的值
```

使用欄位名稱：

```python=
row = cursor.fetchone()  # 獲取一個 Row
value = row.column_name  # 使用欄位名稱獲取欄位的值
```

**注意，欄位名稱需要與資料庫中實際的欄位名稱相符 (區分大小寫)。**

另外，如果你想獲取多個 Rows，可以使用 fetchall 方法來獲取所有 Rows，並使用迴圈逐一處理每個 Row 中的欄位值。

```python=
rows = cursor.fetchall()  # 獲取所有 Rows
for row in rows:
    value = row.column_name  # 使用欄位名稱獲取欄位的值
    # 在這裡處理欄位值...
```

請注意，在使用 fetch 或 fetchall 之前，你需要先使用 execute 方法執行 SQL 查詢，並取得 cursor 物件。

## Ref

- https://www.sqlshack.com/performing-crud-operations-with-a-python-sql-library-for-sql-server/