flask4

數據庫

app

from flask import Flask
from flask_script import Manager

from App.ext import db
from App.views import bp

app = Flask(__name__)
app.config.from_pyfile("settings.py")
manager = Manager(app)

db.init_app(app)
app.register_blueprint(bp)

if __name__ == '__main__':
    manager.run()

APP.ext

from flask_sqlalchemy import SQLAlchemy

# 創建數據庫對象
db = SQLAlchemy()

settings

DEBUG = True
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/day04"
SQLALCHEMY_TRACK_MODIFICATIONS = False

App.views

  • select [字段列表]
  • from [表名]
  • [where]
  • [group by]
  • [having]
  • [order by]
  • [limit]
from flask import Blueprint, render_template, redirect, url_for
from App.models import User,db

bp = Blueprint('bp',__name__,url_prefix='/bp')

# 修改、刪除記錄
@bp.route("/update/")
def db_update():
    # 查詢記錄
    user = User.query.get(1)
    print(user)
    # 修改記錄
    user.password = "123"
    # 刪除記錄
    if user:
        db.session.delete(user)
    # 默認是開啓事務,必須手動提交
    db.session.commit()

    return "更新記錄"

# 自定義基類實現增加、刪除、修改記錄
@bp.route("/change/")
def db_change():
    # 增加一條記錄
    user = User(username='華爲',password='123')
    user.save()

    # 更新
    from hashlib import sha1
    user = User.query.get(3)
    if user:
        user.password = sha1("23423".encode('utf8')).hexdigest()
        user.save()

    # 刪除
    user = User.query.get(3)
    if user:
        user.delete()

    # 增加多條記錄
    user1 = User(username="李澤",password='123')
    user2 = User(username="駱鑫",password='123')
    User.save_all(user1,user2)
    return "change"

# 查詢
@bp.route("/find/")
def find():
    # 基礎查詢
    # get 根據主鍵值查詢,獲取一條記錄,不成返回None,成功返回模型對象
    users = User.query.get(3)
    if users: # 判斷對象是否存在
        print(users,type(users))

    # all 查詢表中的所有記錄
    users = User.query.all()

    # first從結果集中取一條記錄
    users = User.query.first()

    # 獲取指定字段
    users = User.query.with_entities(User.username,User.uid).all()
    users = db.session.query(User).with_entities(User.username).all()

    # 隱藏重複記錄
    users = db.session.query(User.password).distinct().all()
    
    # 排序
    # 字段前的-表示降序,默認是升序
    users = User.query.order_by(-User.uid).all()
    # 多列排序
    users = User.query.order_by(-User.sex,-User.password).all()
    
    # 聚合函數 :max min count sum avg
    from sqlalchemy import func
    # [(3,)]
    users = db.session.query(func.count(User.username)).all()
    # (3,)
    users = db.session.query(func.count(User.uid)).first()
    # 3  scalar()直接獲取數值,返回的必須是一條記錄一個字段
    users = db.session.query(func.count(User.uid)).scalar()
    # 3  統計記錄個數可以直接使用count方法
    users = db.session.query(User).count()

    users = db.session.query(func.max(User.uid)).scalar() # 3
    users = User.query.with_entities(func.min(User.uid)).scalar() # 1
    
    # 分組
    # 統計user表中男和女的數目
    # [(False, 2), (True, 1)]
    users = db.session.query(User.sex,func.count(User.uid)).group_by(User.sex).all()
    # having
    # [(False, 2)]
    users = db.session.query(User.sex,func.count(User.sex)).group_by(User.sex).having(func.count(User.sex)>1).all()
    num = func.count(User.sex).label("num")
    users = db.session.query(User.sex,num).group_by(User.sex).having(num>1).all()

    # limit offset
    # limit取開頭n條記錄
    users = User.query.limit(2).all()
    # offset跳過n條記錄
    users = User.query.offset(1).limit(1).all()
    
    # 條件查詢
    # 關係運算
    users = User.query.filter(User.uid==2).all()
    users = User.query.filter(User.uid!=2).all()
    # uid != 2
    users = User.query.filter(User.uid.__ne__(2)).all()
    # uid!=2 and uid < 5 默認多個條件之間是邏輯與的關係
    users = User.query.filter(User.uid!=2, User.uid<5).all()

    # 字符串處理  like
    users = User.query.filter(User.username.like("小%")).all()
    users = User.query.filter(User.username.like('%雨%')).all()

    # in_和notin_
    users = User.query.filter(User.uid.in_([1,2,3])).all()
    # ~ 等價於notin_
    users = User.query.filter(~User.uid.in_([1,2,3])).all()
    users = User.query.filter(User.uid.notin_([1,2,3])).all()

    # 判空
    # sex is null
    users = User.query.filter(User.sex==None).all()
    # is not null
    users = User.query.filter(User.sex != None).all()

    from sqlalchemy import or_, not_
    # 邏輯運算
    # 邏輯或 or_
    users = User.query.filter(or_(User.sex==None,User.uid<5)).all()
    # 邏輯非,not_
    users = User.query.filter(not_(User.sex==None)).all()
    
    print(users)
    return render_template('list.html',**locals())
    
@bp.route("/many/")
def db_union():
    # 不加連接條件的兩表聯合查詢 笛卡爾積
    data = db.session.query(User,Reply).all()
    # 內連接 連接條件User.uid == Reply.uid
    select * from User u,Reply r where u.uid=r.uid
    data = db.session.query(User,Reply).filter(User.uid==Reply.uid).all()

    # 外連接
    data = User.query.outerjoin(Reply).all()
    print(data)
    return "多表聯合查詢"

App.models

from App.ext import db

class BaseModel:
    # 保存新增或修改的一條記錄
    def save(self):
        try:
            db.session.add(self)
            db.session.commit()
            return True
        except Exception as e:
            print(e)
            db.session.rollback()
            return False
    @classmethod
    def save_all(cls,*args):
        try:
            db.session.add_all(args)
            db.session.commit()
            return True
        except Exception as e:
            print(e)
            db.session.rollback()
            return False

    # 刪除記錄
    def delete(self):
        try:
            db.session.delete(self)
            db.session.commit()
            return True
        except Exception as e:
            print(e)
            db.session.rollback()
            return False


# 必須繼承自Model
class User(db.Model,BaseModel):
    uid = db.Column(db.Integer,primary_key=True,autoincrement=True)
    # nullable本列不能爲空,必須有值
    username = db.Column(db.String(30),nullable=False)
    password = db.Column(db.String(128),nullable=False)
    # name指的是數據庫表中的字段名
    sex = db.Column(db.Boolean,default=False,name='gender')
    __tablename__ = 'user'
    
    def __str__(self):
        return "{}   {}".format(self.uid,self.username)
    
class Reply(db.Model):
    __tablename__ = 'reply'

    rid = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(3000))
    uid = db.Column(db.Integer)
    create_time = db.Column(db.DateTime)

list.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用戶列表</title>
    </head>
    <body>
        <table>
            {% if users is iterable %}
                {% for user in users %}
                <tr>
                    <td>{{ user.username }}</td>
                    <td>{{ user.password }}</td>
                    <td>{{ user.sex }}</td>
                </tr>
                {% endfor %}
            {% endif %}
        
            {% if users is not iterable %}
                <tr>
                    <td>{{ users.username }}</td>
                    <td>{{ users.password }}</td>
                    <td>{{ user.sex }}</td>
                </tr>
            {% endif %}
        </table>
    </body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章