• 【Flask框架】四. Flask框架之 MySQL数据库操作及项目重构


    四. Flask框架之 MySQL数据库操作及项目重构

    MySQL数据库操

    配置数据库的变量

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'zl_flask'
    USERNAME = 'root'
    PASSWORD = '190211'
    DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置数据库的连接

    # 配置数据库的连接
    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
    # 跟踪修改
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    
    • 1
    • 2
    • 3
    • 4

    测试数据库是否连接成功

    db = SQLAlchemy(app)
    @app.route('/')
    def hello_world():
        engine = db.get_engine()
        with engine.connect() as conn:
            result = conn.execute("select 1")
            print(result.fetchone())
        return 'Hello World!'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    增删查改操作

    添加数据
    1. 创建添加的对象
    2. 进行添加操作
    3. 提交操作
    # 创建添加的对象
    user=User(username="123")
    # 进行添加操作
    db.session.add(user)
    # 提交操作
    db.session.commit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    查找数据

    使用filter_by:返回一个类列表的对象

    # filter_by:返回一个类列表的对象
    user=User.query.filter_by(id=2)[0]
    print(user.username)
    
    • 1
    • 2
    • 3
    修改数据
    # 查找出需要修改的数据
    user = User.query.filter_by(id=2)[0]
    # 直接进行修改
    user.username="345"
    # 提交操作
    db.session.commit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    删除数据
    # 整条记录需要删除
    User.query.filter_by(id=2).delete()
    # 提交操作
    db.session.commit()
    
    • 1
    • 2
    • 3
    • 4
    一对多

    ORM类

    安装Flask-Migrate插件

    绑定app和数据库

    migrate = Migrate(app,db)
    
    • 1
    映射ORM

    首先需要初始化一个迁移文件夹:

    flask db init
    
    • 1

    然后再把当前的模型添加到迁移文件中:

    flask db migrate
    
    • 1

    最后再把迁移文件中对应的数据库操作,真正的映射到数据库中:

    flask db upgrade
    
    • 1

    项目重构

    config.py

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'zl_flask'
    USERNAME = 'root'
    PASSWORD = '190211'
    DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
    SQLALCHEMY_DATABASE_URI = DB_URI
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ext.py

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    • 1
    • 2
    • 3

    models.py

    from exts import db
    
    class User(db.Model):
        __tablename__ = "user"
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        username = db.Column(db.String(200),nullable=False)
        # password = db.Column(db.String(200),nullable=False)
    
    
    class UserExtension(db.Model):
        __tablename__ = "user_extension"
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        school = db.Column(db.String(100))
        user_id = db.Column(db.Integer,db.ForeignKey("user.id"))
    
        # db.backref
        # 1. 在反向引用的时候,如果需要传递一些其他的参数,那么就需要用到这个函数,否则不需要使用,只要在relationship的backref参数上,设置反向引用的名称就可以了。
        # 2. uselist=False:代表反向引用的时候,不是一个列表,而是一个对象。
        user = db.relationship("User",backref=db.backref("extension",uselist=False))
    
    
    class Article(db.Model):
        __tablename__ = "article"
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        title = db.Column(db.String(200),nullable=False)
        content = db.Column(db.Text,nullable=False)
    
        # 外键:
        # 1. 外键的数据类型一定要看,所引用的字段的类型
        # 2. db.ForeignKey("表名.字段名 ")
        # 3. 外键是属于数据库层面的,不推荐直接在ORM中使用
        author_id = db.Column(db.Integer,db.ForeignKey("user.id"))
    
        # relationship:
        # 1. 第一个参数是模型的名字,必须要和模型的名字保持一致
        # 2. backref(back reference):代表反向引用,代表对方访问我的时候的字段名称
        author = db.relationship("User",backref="articles")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    app.py

    from flask import Flask
    from flask_migrate import Migrate
    from models import Article,User,UserExtension
    import config
    from exts import db
    
    app = Flask(__name__)
    app.config.from_object(config)
    # 把app绑定到db上
    db.init_app(app)
    
    migrate = Migrate(app,db)
    
    
    @app.route("/otm")
    def one_to_many():
        article1 = Article(title="111",content="xxx")
        article2 = Article(title="222", content="yyy")
        user = User(username="zhiliao")
        article1.author = user
        article2.author = user
        db.session.add(article1,article2)
        db.session.commit()
    
        print(user.articles)
        return "one to many数据操作成功"
    
    
    @app.route("/oto")
    def one_to_one():
        user = User(username="zhiliao")
        extension = UserExtension(school="清华大学")
        user.extension = extension
        db.session.add(user)
        db.session.commit()
        return "one to one"
    
    
    @app.route("/article")
    def article_view():
        # 1. 添加数据
        # insert table article values(xx)
        # article = Article(title="钢铁是怎样炼成的",content="xxx")
        # db.session.add(article)
        # # 做一个提交操作
        # db.session.commit()
    
        # 2. 查询数据
        # filter_by:返回一个类列表的对象
        # article = Article.query.filter_by(id=1)[0]
        # print(article.title)
    
        # 3. 修改数据
        # article = Article.query.filter_by(id=1)[0]
        # article.content = "yyy"
        # db.session.commit()
    
        # 4. 删除数据
        Article.query.filter_by(id=1).delete()
        db.session.commit()
        return "数据操作成功"
    
    
    @app.route('/')
    def hello_world():
        # 写一个测试代码来验证是否连接成功
        engine = db.get_engine()
        with engine.connect() as conn:
            result = conn.execute("select 1")
            print(result.fetchone())
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    然后进行以下3个命令即可完成迁移操作了。

    flask db init
    flask db migrate
    flask db upgrade
    
    • 1
    • 2
    • 3
  • 相关阅读:
    [python] 利用 Pydoc 快速生成整个 Python 项目的文档
    【深度学习】如果我年少有为,会垃圾分类
    Spring Boot 2.x源码系列【4】启动流程深入解析之启动监听器
    2023年Flutter教程_Flutter+Getx仿小米商城项目实战视频教程-V3版
    java毕业设计软件源代码javaweb进销存管理系统的设计与实现|仓库
    flink 技术总结待续
    可编程 USB 转串口适配器开发板 DS1302 时钟芯片参数读取与修改
    Navicat For MySQL使用指南
    8 Functions for Transforming Text
    Glide源码分析
  • 原文地址:https://blog.csdn.net/qq_44824148/article/details/123542838