---
# System prepended metadata

title: 使用SQL指令操作資料庫
tags: [程式學習與問題總集]

---

# 使用SQL指令操作資料庫
###### tags: `程式學習與問題總集`

## 新增資料表
* 連線
```python=
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

#app.config['SQLALCHEMY_DATABASE_URL'] = 'postgresql://管理者帳號:管理者密碼@資料庫位址:5432/資料庫名稱'
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://admin:123456@127.0.0.1:5432/testdb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
```

* 使用SQL語法操作PostgreSQL資料庫的語法為
```sql=
命令變數 = "SQL語法"
db.engine.execute(命令變數)
```

* 新增資料表
```sql=
CREATE TABLE 資料表名稱(
    欄位1  資料型態,
    欄位2  資料型態,
)
```
* 範例
```python=
@app.route('/setup')
def setup():
    sql = """
    CREATE TABLE student2(
        sid serial NOT NULL,
        name character varying(50) NOT NULL,
        tel character varying(50),
        addr character varying(200),
        email character varying(100),
        PRIMARY KEY(sid))
    """
    db.engine.execute(sql)    
    return '資料表創建成功'
```
* 結果
![](https://i.imgur.com/kJvCXi2.png)

## 新增資料
* 資料型態必須一模一樣，否則會發生錯誤......
```sql=
INSERT INTO 資料表名稱(欄位名稱1, 欄位名稱2, ......)
    VALUES(欄位值1, 欄位值2)
```
* 範例
```python=
@app.route('/insert')
def insert():
    sql = """
    INSERT INTO student2(name, tel, addr, email) VALUES('rex', '0962015850', 'taiwan', 'rex@gamil.com');
    INSERT INTO student2(name, tel, addr, email) VALUES('xia', '09645454540', 'taiwan', 'xia@gamil.com');
    INSERT INTO student2(name, tel, addr, email) VALUES('toor', '09620458454', 'taiwan', 'toor@gamil.com');
    """
    db.engine.execute(sql)    
    return '資料新增成功'
```
* 結果
![](https://i.imgur.com/HCjq940.png)

## 查詢資料
```sql=
SELECT 欄位名稱1, 欄位名稱2 FROM 資料表名稱 [ WHERE 條件式 ORDER BY 欄位名稱 [ASC|DESC]]
```
* WHERE、ORDER BY參數可有可無，WHERE是條件，ORDER BY是排序，ASC是遞減排序，DESC是遞增排序

* 範例
```python=
@app.route('/query')
def query():
    #取得全部
    sql = "SELECT * FROM student2 ORDER BY sid"
    students = db.engine.execute(sql) 
    msg = ''
    for student in students:
        msg += f"{student['name']}, {student['tel']}, {student['addr']}, {student['email']}<br>"
    return msg
```

* 結果
![](https://i.imgur.com/kwiKVzi.png)

## 更新資料
```sql=
UPDATE 資料表名稱 SET 欄位名稱1 = 值1,欄位名稱2 = 值2,.......[WHERE 條件式]
```
* WHERE的參數可有可無，但是要小心操作......
* 範例
```python=
@app.route('/updateuser/<int:uid>')
def updateuser(uid):
    sql = "UPDATE student2 SET name = 'admin' WHERE sid = " + str(uid) 
    db.engine.execute(sql)    
    return '資料修改成功'
```
* 結果
![](https://i.imgur.com/RdzrWxH.png)

## 刪除資料
```sql=
DELETE FROM 資料表名稱 [ WHERE 條件式 ]
```
* WHERE的參數可有可無，但是要小心操作......
* 範例
```python=
@app.route('/deleteuser/<int:uid>')
def deleteuser(uid):
    sql = "DELETE FROM student2  WHERE sid = " + str(uid) 
    db.engine.execute(sql)    
    return '資料刪除成功'
```

* 結果
![](https://i.imgur.com/tkcU8EE.png)
