zoukankan      html  css  js  c++  java
  • flask中的数据操作

    flask中数据访问:

    pip install flask-sqlalemy
    

    创建数据:

     创建app的工厂
    
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_bootstrap import Bootstrap
    from flask_nav import Nav
    from flask_nav.elements import *
    from .views import initApp
    
    boot=Bootstrap()
    nav=Nav()
    db=SQLAlchemy()
    
    def creteApp():
        app = Flask(__name__)
        # baseDir = os.path.abspath(os.path.dirname(__file__))
        app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:434944800@192.168.101.130/test02?charset=utf8'
        app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True   #该配置为True,则每次请求结束都会自动commit数据库的变动
        app.config['SQLALCHEMY_ECHO']=True
        nav.register_element('top', Navbar('flask入门',
                                           View('主页', 'index'),
                                           View('关于', 'about')
                                           ))
        nav.init_app(app)
        db.init_app(app)
        boot.init_app(app)
        initApp(app)
        app.config.from_pyfile('config.py')
    
        return app
    

    启动文件Manager.py配置

    from flask_script import Manager
    from apps.flaskDemo import creteApp
    app=creteApp()
    manager=Manager(app)
    
    @manager.command
    def dev():
        from livereload import Server
        liveServer=Server(app.wsgi_app)
        liveServer.watch('templates/*.*')
        liveServer.serve(open_url=True)
    
    @manager.command
    def createTable():
        from apps.flaskDemo import db
        from apps import models
        db.create_all()
    
    
    if __name__ == '__main__':
        manager.run()
        #app.run(debug=True)
    

    启动应用:

         python manager runserver
    

    创建Models:

    from .flaskDemo import db
    class usersInfo(db.Model):
        __tablename__='u_info_2_hello'
        id=db.Column(db.Integer,primary_key=True)
        username=db.Column(db.String(100),nullable=True)
        user_age=db.Column(db.Integer,nullable=True)
        email=db.Column(db.String(300),nullable=True)
    

    主外键关系表

    class roles(db.Model):
        __tablename__='userRoles'
        id=db.Column(db.Integer,primary_key=True)
        roleName=db.Column(db.String(200),nullable=True)
        users=db.relationship('user',backref='myrole')     方向反向查寻
        
    class user(db.Model):
        __tablename__='users'
        id=db.Column(db.Integer,primary_key=True)
        userName=db.Column(db.String(200),nullable=True)
        userEmail=db.Column(db.String(200),nullable=True)
        roleId=db.Column(db.Integer,db.ForeignKey('userRoles.id'))    与userRoles表的id键关联
    

    多对多关系创建:

    tags=db.Table(
        'post_tag_mapping',
        db.Column('post_id',db.Integer,db.ForeignKey('Post.id')),
        db.Column('tag_id',db.Integer,db.ForeignKey('Tag.id'))
    )
    class Post(db.Model):
        __tablename__ = 'Post'
        id=db.Column(db.Integer(),primary_key=True)
        title=db.Column(db.String(255))
        text=db.Column(db.TEXT)
        publish_date=db.Column(db.DateTime)
        tags=db.relationship(
            'Tag',
            backref=db.backref('myPost'),
            secondary=tags
        )
    
    class Tag(db.Model):
        __tablename__='Tag'
        id=db.Column(db.Integer,primary_key=True)
        title=db.Column(db.String(255))
    
    在以上代码中,使用了db.relationsship函数来设置所需的关系,但是这次多了secondary(次级)参数,该参数会告知sqlalchemy该关联的对象被保存在tag所对应的表中,在代码生成的表中,表关系被保存在了post_tag_mapping中
    
    
    
    创建表:
    
        python manage.py  createTable
    

    数据的CRUD

    创建角色表数据
    @app.route('/create/')
    def createRole():
        from .models import roles
        from .flaskDemo import db
        admin=roles(
            roleName='admin1'
        )
        roles1=roles(
            roleName='backupUsers'
        )
    
        db.session.add_all([admin,roles1])   使用db.session.add_all([admin,roles])的方式可以同时创建多个,注意在add_all()方法中的参数是一个列表
    
        return render_template('data/result1.html')
    
    主外键表关系数据的创建
    @app.route('/createuser/')
    def createUser():
        from .models import roles,user
        from .flaskDemo import db
        role=roles.query.get(3)     获取角色数据
        print(type(role))
        print(role.roleName)
        #外键部分可以实例,也可以写id值
        u=user(
            userName='test',
            userEmail='222@ddd.com',
            myrole=role
        )
        # u = user(
        #     userName='test',
        #     userEmail='222@ddd.com',
        #     roleId=role.id
        # )
        db.session.add(u)
        db.session.commit()
        return render_template('data/result1.html')
        
     #数据的查询 ,获取全部数据
    @app.route('/queryall/')
    def queryallUser():
        from .models import roles, user
        from .flaskDemo import db
        uinfo=user.query.all()
        for item in uinfo:
            print(item.userName)
        return render_template('data/result1.html')
     #数据的查询,获取一条数据   
    @app.route('/queryone/')
    def querysingleUser():
        from .models import roles, user
        from .flaskDemo import db
        uinfo = user.query.get(2)
        print(uinfo.userName)
        return render_template('data/result1.html')
    更新与删除:
     @app.route('/removeUser/')
        def removeUser():
            '''
            删除数据
            :return:
            '''
            from .models import roles, user
            from .flaskDemo import db
            u=user.query.get(1)
            db.session.delete(u)
            db.session.commit()
            return render_template('data/result1.html')
    
        @app.route('/updateuinfo/')
        def updateUserInfo():
            '''
            更新数据
            :return:
            '''
            from .models import roles, user
            from .flaskDemo import db
            u=user.query.get(2)
            u.userName='abc'
            db.session.add(u)
            db.session.commit()
            return render_template('data/result1.html')
            
        @app.route('/crosstable/')
        def query_crosstable():
            '''
            查找到角色,并查询下慎于的用户
            :return: 
            '''
            from .models import user,roles
            r=roles.query.get(2)
            u=r.users
            for item in u:
                print(item.userName)
            return render_template('data/result1.html')
    

    一对多正反查询:

    @app.route('/u2r/')
    def queryDataFromUser2Role():
        from .models import user
        user01=user.query.first()
        role=user01.myrole
        print(user01.userName,"=======>role:",role.roleName)
        return render_template('data/result1.html')
        
    @app.route('/r2u/')
    def queryDataFromRole2User():
        from .models import roles
        r=roles.query.get(2)
        user=r.users
        print('roles',r.roleName,"==========>users:",user)
        print('user的类型是是========>',type(user))
        for item in user:
            print(item.userName)
        return render_template('data/result1.html')
    

    反向的应用的另一种用法

    @app.route('/userrole/')
    def createUserRole():
        '''
        创建用户并添加到对应角色
        :return: 
        '''
        from .models import user,roles
        from .flaskDemo import db
        role1=roles.query.get(1)
        u=user(
            userName='test',
            userEmail='fsfsd'
        )
        role1.users.append(u)
        db.session.add(role1)
        db.session.commit()
        return render_template('data/result1.html')
    

    限制返回条目:

    @app.route('/limituser/')
    def limitUser():
        '''
        限制返回条数
        :return: 
        '''
        from .models import user
        users=user.query.limit(10).all()
        for item in users:
            print(item)
        return render_template('data/result1.html')
    

    分页:

    def pageinate():
        from .models import user
        u=user.query.paginate(1,10)
        print(type(u))
        print(u.items)
        for item in u.items:
            print(item.userName)
        #当前页
        print(u.page)
        #总页
        print(u.pages)
        #前一页是否有对象可显示
        print(u.has_prev)
        #后一页是否有数据显示
        print(u.has_next)
        return render_template('data/result1.html')
    

    多对多的数据操作:

    多对多关系数据的写入

    @app.route('/createm2m/')
    def createm2mRelData():
        from .models import Post,Tag
        import datetime
        from .flaskDemo import db
        post_one=Post(
            title='鬼吹灯',
            text='乎啦啦啦啦啦',
            publish_date=datetime.datetime.now()
        )
        tag_one=Tag(
            title='测试'
        )
        tag_two=Tag(
            title='这是一个测试'
        )
        post_one.tags=[tag_one,tag_two]
        db.session.add(post_one)
        db.session.commit()
        return render_template('data/result1.html')
    

    多对多关系数据的查找

    @app.route('/query4m2m/')
    def query4m2m():
        from .models import Post, Tag
        #通过post得到tag
        print('通过post====================>tag')
        post_data=Post.query.get(1)
        #print(dir(post_data))
        #print(post_data.tags)
        for item in post_data.tags:
            print(item.title)
        #通过tag得到post
        print('通过tag=============>post')
        tag_data=Tag.query.get(1)
        #print(dir(tag_data))
        print(tag_data.title)
        for item in tag_data.myPost:
            print(item.title)
        return render_template('data/result1.html')
    

    多对多关系数据的更新

    @app.route('/update4m2m/')
    def updateRelform2mData():
        '''
        更新多对多关系
        :return:
        '''
        from .models import Post,Tag
        from .flaskDemo import db
        postData=Post.query.get(1)
        tagData=Tag.query.all()
        print(type(tagData))
        postData.tags=tagData
        db.session.add(postData)
        db.session.commit()
        return render_template('data/result1.html')
    

    多对多关系数据的关系删除

    @app.route('/removeRel/')
    def removeRelform2mData():
        ''''
        移除多对多关系
        '''
        from .models import Post,Tag
        postData=Post.query.get(1)
        tagData=Tag.query.get(2)
        postData.tags.remove(tagData)
        #print(dir(postData.tags))
        return render_template('data/result1.html')
    

    出现以下错误的处理方法:

    C:Python34libsite-packagesflask_sqlalchemy__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and wil
    

    l be disabled by default in the future. Set it to True or False to suppress this warning.

    'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '

    将以下代码

    track_modifications = app.config.setdefault(
        'SQLALCHEMY_TRACK_MODIFICATIONS', None
    )
    

    改为:

    track_modifications = app.config.setdefault(
        'SQLALCHEMY_TRACK_MODIFICATIONS', True
    )
  • 相关阅读:
    设计模式之享元模式
    延时任务的实现
    Git代码分支开发工作流程
    设计模式之责任链模式
    Docker 三剑客 到 k8s 介绍
    写操作系统之实现进程
    写操作系统之开发加载器
    写操作系统之开发引导扇区
    写操作系统之搭建开发环境
    怎么实现系统调用wait和exit
  • 原文地址:https://www.cnblogs.com/lijintian/p/9054553.html
Copyright © 2011-2022 走看看