# 使用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 '資料表創建成功'
```
* 結果

## 新增資料
* 資料型態必須一模一樣,否則會發生錯誤......
```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 '資料新增成功'
```
* 結果

## 查詢資料
```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
```
* 結果

## 更新資料
```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 '資料修改成功'
```
* 結果

## 刪除資料
```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 '資料刪除成功'
```
* 結果
