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([..,..,..])

results matching ""

    No results matching ""