zoukankan      html  css  js  c++  java
  • sqlalchemy增删改查

    今天整理一下flask-sqlalchemy对数据库的操作, 基础代码如下

    cat flaskStudy.py

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    import os
    basedir = os.path.abspath(os.path.dirname(__file__))
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqllist')
    db = SQLAlchemy(app)
    
    class Role(db.Model):
        __tablename__ = 'roles'
        users = db.relationship('User', backref='role')  # roles表与users表一对多的映射关系
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64), unique=True)
    
        def __repr__(self):
            return "<Role %r>" % self.name
    
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))  # role_id 的值根据伪列role的值(指向roles对象)自动生成
        username = db.Column(db.String(64), unique=True, index=True)
    
        def __repr__(self):
            return "<User %r>" % self.username
    
    
    
    if __name__ == '__main__':
        app.run()
      
    

      

      两张表:roles, users, 一对多关系

    1、数据插入

    (venv) D:flaskStudy>set FLASK_APP=flaskStudy.py
    
    (venv) D:flaskStudy>set FLASK_DEBUG=1
    
    (venv) D:flaskStudy>flask shell
    Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
    App: flaskStudy [production]
    Instance: D:flaskStudyinstance
    >>> from flaskStudy import db, Role, User
    >>> db.drop_all()  # 删除所有表
    >>> db.create_all() # 创建所有表
    >>> admin_role=Role(name='Admin')  # 创建角色对象
    >>> mod_role=Role(name='Moderator')
    >>> user_role=Role(name='User')
    >>> user_john=User(username='John',  role=admin_role)  # 创建用户对象, 根据role对象动态生成role_id
    >>> user_susan=User(username='susan', role=user_role)
    >>> user_david=User(username='david', role=user_role)
    >>> db.session.add(admin_role)
    >>> db.session.add(mod_role)
    >>> db.session.add(user_role)
    >>> db.session.add(user_john)
    >>> db.session.add(user_susan)
    >>> db.session.add(user_david)
    >>> db.session.commit()
    

      

    2、数据查询

    (venv) D:flaskStudy>flask shell
    Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
    App: flaskStudy [production]
    Instance: D:flaskStudyinstance
    >>> from flaskStudy import db, User, Role
    >>> user_role=Role.query.filter_by(name='User').first()  # 查询一条roles数据
    >>> user_role
    <Role 'User'>
    >>> user_role.users  # 根据users列正向查询users表对应的用户
    [<User 'susan'>, <User 'david'>]
    >>> user_david=User.query.filter_by(username='david').first() # 查询一条用户数据
    >>> user_david
    <User 'david'>
    >>> user_david.role  # 根据伪列role查询对应的角色
    <Role 'User'>
    >>>
    

    3、数据修改

    (venv) D:flaskStudy>flask shell
    Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
    App: flaskStudy [production]
    Instance: D:flaskStudyinstance
    >>> from flaskStudy import db, User, Role
    >>> Role.query.all()  # roles表有三条数据
    [<Role 'Admin'>, <Role 'Moderator'>, <Role 'User'>]
    >>> admin_role=Role.query.filter_by(name='Admin').first()  # 查询其中一条数据
    >>> admin_role
    <Role 'Admin'>
    >>> admin_role.name='Administrator'  # 将name值修改为Administrator
    >>> db.session.add(admin_role)
    >>> db.session.commit()
    >>> Role.query.all()
    [<Role 'Administrator'>, <Role 'Moderator'>, <Role 'User'>]
    

      

    4、删除数据

    >>> Role.query.all()  # 角色中三条记录
    [<Role 'Administrator'>, <Role 'Moderator'>, <Role 'User'>]
    >>> user_role=Role.query.filter_by(name='User').first()  # 其中一条数据对象
    >>> user_role
    <Role 'User'>
    >>> db.session.delete(user_role) # 删除此对象
    >>> db.session.commit()
    >>> Role.query.all()
    [<Role 'Administrator'>, <Role 'Moderator'>]
    >>> User.query.all()  # users表中后两条数据的role_id没有了依赖被置空
    [<User 'John'>, <User 'susan'>, <User 'david'>]
    

      

    5、集成Python shell

      每次启动flask shell会话都要手动导入数据库实例和模型才能进行数据库操作, 当启动flask shell时如何实现自动导入呢?

      shell_context_processor:  注册并创建一个shell上下文处理器。

    @app.shell_context_processor  # 注册并创建shell上下文处理器
    def make_shell_context():
        return dict(db=db, User=User, Role=Role)  # 返回包含实例和模型的字典
    
    
    再次运行flask shell, 这些实例和模型都可以使用了
    
    (venv) D:flaskStudy>flask shell
    Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
    App: flaskStudy [production]
    Instance: D:flaskStudyinstance
    >>> db
    <SQLAlchemy engine=sqlite:///D:flaskStudydata.sqllist>
    >>> app
    <Flask 'flaskStudy'>
    >>> User
    <class 'flaskStudy.User'>
    >>> Role
    <class 'flaskStudy.Role'>
    

      

    6、创建迁移仓库

      项目迁移后, 数据库同样需要迁移

    from flask_migrate import Migrate
    migrate = Migrate(app, db)
    

       db init子命令添加添加数据库迁移支持, 此时自动创建目录存储数据 

  • 相关阅读:
    codeforces628D. Magic Numbers (数位dp)
    hdu5432Rikka with Array (数位dp+十进制转化为二进制)
    LA3902 Network (树上dfs)
    zoj3494 BCD Code(AC自动机+数位dp)
    codeforces #345 (Div. 1) D. Zip-line (线段树+最长上升子序列)
    zjnu1786 PROSJEK(二分)
    九度1497:面积最大的全1子矩阵 (单调队列,单调栈)
    zjnu1726 STOGOVI (lca)
    zjnu1735BOB (单调队列,单调栈)
    uva10859 Placing Lampposts (树形dp+求两者最小值方法)
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/13049195.html
Copyright © 2011-2022 走看看