• Flask 学习14.FlaskSQLAlchemy ORM操作数据库增删改查 上海


    前言

    SQLAlchemy采用简单的Python语言,提供高效和高性能的数据库访问,实现了完整的企业级持久模型。
    它提供了SQL工具包和ORM(对象关系映射)工具,类似于Django 自带的 ORM 框架操作数据库。

    创建模型

    先创建模型

    from flask import Flask, url_for, request, redirect, render_template
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    # 设置数据库连接地址
    DB_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/web'
    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
    # 是否追踪数据库修改,一般不开启, 会影响性能
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    # 是否显示底层执行的SQL语句
    app.config['SQLALCHEMY_ECHO'] = True
    
    # 初始化db,关联flask 项目
    db = SQLAlchemy(app)
    
    
    # 创建模型
    class Students(db.Model):
        __tablename__ = 'students'  # 数据库表名
    
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(20))
        fullname = db.Column(db.String(30))
        nickname = db.Column(db.String(30))
    
        def __repr__(self):
            return "<Students(name='%s', fullname='%s', nickname='%s')>" % (
                     self.name, self.fullname, self.nickname)
    
    if __name__ == '__main__':
        # 创建表
        db.create_all()
        app.run(debug=True)
    
    

    新增数据

    往表里面添加数据db.session.add()

    @app.route('/demo', methods=["GET"])
    def demo():
        # 实例化 Students 模型对象
        user = Students(name='yy', fullname='yoyo')
        # 添加到会话,并用commit提交数据
        db.session.add(user)
        db.session.commit()
        return {
            "code": 0,
            "msg": "create success!"
        }
    
    

    访问接口地址http://127.0.0.1:5000/demo,数据库就会有新增数据

    一次添加多个数据,用db.session.add_all()

    @app.route('/demo', methods=["GET"])
    def demo():
        # 实例化 Students 模型对象
        user1 = Students(name='yy1', fullname='yoyo1')
        user2 = Students(name='yy2', fullname='yoyo2')
        user3 = Students(name='yy3', fullname='yoyo3')
        # 添加到会话,并用commit提交数据
        # db.session.add(user)
        db.session.add_all([user1, user2, user3])
        db.session.commit()
        return {
            "code": 0,
            "msg": "create success!"
        }
    

    query 查询数据

    查询表的全部数据

    Students.query.all()
    

    查询示例

    @app.route('/demo', methods=["GET"])
    def demo():
        # 返回列表
        all = Students.query.all()
        print(all)
        return {
            "code": 0,
            "msg": "success"
        }
    

    查询结果返回一个对象列表

    [<Students(name='yy', fullname='yoyo', nickname='None')>, <Students(name='yy1', fullname='yoyo1', nickname='None')>]
    

    查询第一个结果

    Students.query.first()
    

    get()方法可以直接通过id查询

    Students.query.get(1)
    

    如果没有查询到结果返回None, 这一点处理的比较好

    支持filter() 和 filter_by() 查询

    Students.query.filter(Students.name == 'yy').all()
    Students.query.filter_by(name='yy').all()
    

    关于filter() 和 filter_by()的区别可以看前面这篇https://www.cnblogs.com/yoyoketang/p/16487628.html

    修改和删除

    修改数据 用update()方法,删除用delete()

    # 修改
    Students.query.filter_by(name='yy').update({"fullname": "xx"})
    db.session.commit()
    
    # 删除
    Students.query.filter_by(name='yy').delete()
    db.session.commit()
    

    需注意修改和删除跟新增数据一样,都需要调用commit()才会执行成功

    自动提交commit()

    除了查询操作,其它添加数据修改数据,都需要加上 db.session.commit() 才会生效,很多小伙伴容易忘记这个操作,在配置里面可以加一个配置项

        # 不需要commit 自动保存, 默认False
        app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    

    这样不用 db.session.commit() 也会自动保存了。

  • 相关阅读:
    【转】NSArray,NSSet,NSDictionary总结
    dequeueReusableCellWithIdentifier
    可任意自定义的UITableViewCell
    contentSize、contentInset和contentOffset区别
    Cocoa的MVC架构分析 delegate
    WP7 Toolkit ExpanderView 控件 介绍 02
    ObjectiveC中一种消息处理方法performSelector: withObject:
    [转]HTML5多点触摸演示源码(Canvas绘制演示)
    Matlab 积分图的快速计算
    测试
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16617172.html
Copyright © 2020-2023  润新知