1.建立model
flask-Sqlalchemy是一個ORM,可以把RDB架構映射成物件形式的資料庫抽象層,讓開發者不需要了解query指令,就可以操作資料庫
app.py ==>
from flask import Flask
# 使用flask_sqlalchemy 是flask的擴充,因為flask是很彈性的web framework,本身是很輕量的,可自由增加擴充的元件
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
models.py ==>
class User(UserMixin,db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
userName = db.Column(db.String(16), unique = True)
password_hash = db.Column(db.String(128))
fullName = db.Column(db.String(32))
phoneNumber = db.Column(db.String(16), unique = True)
email = db.Column(db.String(64), unique = True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
@property
def password(self):
raise AttributeError('password is wrong')
#直接對password屬性作存的動作,但不能直接取
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
# 登入時會進這個方法,確認該密碼跟存在db的hash值是相同的
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
2.shell指令
python manage.py shell ==>
# 要先在flask_script的Manager實例定義command
>>> db.drop_all() # 刪除整個的tables
>>> db.create_all() # 依照models定義的欄位建立tables
>>> user = User(userName='josh') # 建立一個User實例
>>> db.session.add(user)
>>> db.session.commit() # 即可以在shell快速測試新增的資料
3.CRUD
## 新增,因為前面的User model沒有定義欄位是nullable=False,所以不給欄位也可以
user = User(userName='josh') # 這時候只是把實例建立出來,但並沒有寫到資料庫,user.id還看不到東西
db.session.add(user)
db.session.commit() # 這時候user.id看的到了!!
## 查詢
u = User.query.filter_by(userName = 'josh') # 類別是flask_sqlalchemy.BaseQuery
## 刪除
# 這時候還無法對u做刪除、修改等動作,因為還不是User類別
db.session.delete(u) # 會報錯
u = User.query.filter_by(userName = 'josh').first() # 加個.first()或.all()才是自定義的User類別
db.session.delete(u)
db.session.commit()
## 修改
# 直接對User類別屬性作修改即可
u.email = '[email protected]'
db.session.add(u)
db.session.commit()
# 如果有大量寫入需求
db.session.add_all([..,..,..])