Flask:05-一首歌的时间掌握flask数据模型(01)

数据模型

数据库回顾

  • 分类:

    • 关系型数据库:MySQL、sqlite、…
    • 非关系型数据库:Redis、MongoDB、…
  • 操作:
    • 执行原生SQL语句,每次都需要拼接SQL语句,非常繁琐而且特别容易出错。
    • ORM(对象关系映射),使用ORM可以通过对对象的操作完成对数据库的操作。

flask-sqlalchemy

  • 说明:其实是sqlalchemy扩展库在flask中的移植库,通过了绝大多数关系型数据库的支持(ORM)
  • 安装:pip install flask-sqlalchemy
  • 连接地址配置:
    • 名称:SQLALCHEMY_DATABASE_URI
    • 格式:
      • sqlite:sqlite:/// + 数据库文件名
      • MySQL:数据库名+驱动名://用户名:密码@主机:端口/数据库
  • 使用:
    # 配置数据连接地址
    base_dir = os.path.dirname(__file__)
    database_uri = ‘sqlite:///‘ + os.path.join(base_dir, ‘data.sqlite‘)
    app.config[‘SQLALCHEMY_DATABASE_URI‘] = database_uri
    # 禁止数据的修改追踪(需要消耗资源)
    app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False
    
    # 创建数据库操作对象
    db = SQLAlchemy(app)
    
    # 设计模型类
    class User(db.Model):
        # 表名默认会将模型名转为小写加下划线的形式
        # 如:UserModel => user_model
        # 指定表名
        __tablename__ = ‘users‘
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(20), unique=True)
        email = db.Column(db.String(32), unique=True)
    
  • 数据表操作
    @app.route(‘/create/‘)
    def create():
        # 创建数据表
        db.create_all()
        return ‘数据表已创建‘
    
    @app.route(‘/drop/‘)
    def drop():
        db.drop_all()
        return ‘数据表已删除‘
    
    # 添加终端命令,完成数据表的创建
    @manager.command
    def createall():
        # 先删除原来的,副作用很大
        db.drop_all()
        # 然后再创建
        db.create_all()
        return ‘数据表已创建‘
    
    # 添加终端命令,完成数据表的删除
    @manager.command
    def dropall():
        if prompt_bool(‘您确定要删库跑路吗?‘):
            db.drop_all()
            return ‘数据表已删除‘
        return ‘删库有风险,操作需谨慎!‘
    

    执行终端命令:python manage.py createall,即可创建数据表

数据库迁移

  • 说明:将数据模型的更改应用到数据表的操作叫数据库迁移。flask-migrate就是专门做迁移的扩展库。
  • 安装:pip install flask-migrate
  • 使用:
    from flask_migrate import Migrate
    
    # 创建数据库迁移对象
    migrate = Migrate(app, db)
    
    # 将迁移命令添加到终端
    manager.add_command(‘db‘, MigrateCommand)
    
  • 迁移:
    • 初始化,只需要一次,创建用户存放迁移脚本的目录及相关文件。
    python manage.py db init
    
    • 根据数据模型与数据表,生成迁移脚本。
    python manage.py db migrate
    
    • 执行迁移脚本
    python manage.py db upgrade
    
  • 提示:
    • 初始化操作只需要一次,以后生成迁移脚本与执行迁移脚本循环执行即可完成数据库的迁移。
    • 不是每次迁移都会成功,迁移出错时需要手动解决。

CURD操作

  • 增加数据

    # 设置自动提交操作,请求结束时无论如何都会提交
    app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True
    
    # 增加数据
    @app.route(‘/insert/‘)
    def insert():
        # 创建对象
        # jie = User(name=‘八戒‘, email=‘[email protected]‘, age=30)
        # hou = User(name=‘猴哥‘, email=‘[email protected]‘, age=20)
        # 保存到数据库,只能保存一条数据
        # db.session.add(hou)
    
        bei = User(name=‘贝贝‘, email=‘[email protected]‘, age=28)
        jing = User(name=‘晶晶‘, email=‘[email protected]‘, age=18)
        huan = User(name=‘欢欢‘, email=‘[email protected]‘, age=22)
        ying = User(name=‘迎迎‘, email=‘[email protected]‘, age=23)
        ni = User(name=‘妮妮‘,email=‘[email protected]‘,
        age=20)
    
        # 保存到数据库,一次性保存多条数据
        db.session.add_all([bei, jing, huan, ying, ni])
    
        # 提交操作,若没有设置自动提交,每次执行操作都需要手动提交一次
        # db.session.commit()
    
        return ‘数据已添加‘
    
  • 查询数据
    # 查询操作
    @app.route(‘/select/<uid>/‘)
    def select(uid):
        # 根据主键进行查询,找到返回对象,没找到返回None
        user = User.query.get(uid)
        if user:
            return user.name
        return ‘查无此人‘
    
  • 修改数据
    # 修改数据
    @app.route(‘/update/<uid>/‘)
    def update(uid):
        user = User.query.get(uid)
        if user:
            user.email = ‘[email protected]‘
            # 再次添加到数据库即可
            db.session.add(user)
            return ‘数据已修改‘
        return ‘查无此人‘
    
  • 删除数据
    # 删除数据
    @app.route(‘/delete/<uid>/‘)
    def delete(uid):
        user = User.query.get(uid)
        if user:
            db.session.delete(user)
            return ‘数据已删除‘
        return ‘查无此人‘
    

模型设计参考

  • 常见的字段类型

    字段类型 python类型 说明
    Integer int 整型(32)
    SmallInteger int 整型(16)
    BigInteger int/long 整型(64)
    Float float 浮点型
    String str 变长字符串
    Text str 不受限制的文本
    Boolean bool 布尔值,True/False
    Date datetime.date 日期
    Time datetime.time 时间
    DateTime datetime.datetime 日期时间
    Interval datetime.timedelta 时间间隔
    PickleType pickle.dumps() 使用pickle模块序列化后的python对象
    LargeBinary bytes 任意大的二进制数据
  • 常见字段选项
    选项 说明
    primary_key 是否作为主键索引,默认为False
    autoincrement 是否设置字段自增,默认为False
    unique 是否作为唯一索引,默认为False
    index 是否作为普通索引,默认为False
    nullable 字段是否可以为空,默认为True
    default 设置默认值
  • 总结:
    • 插入数据可以不传值的情况:自增的字段、可以为空的字段、有默认值的字段
    • 使用flask-sqlalchemy时每个模型都需要有一个主键,通常主键字段名称为id
    • 数据模型类名与数据表中的名字
      • 默认:会将模型名转换为小写加下划线的方式,如:UserModel => user_model
      • 指定:通过类属性__tablename__指定表名

各种查询

  • 说明:在数据库的操作中,绝大多数都是查询操作,而且这些操作都是通过方法来实现的。
  • 常见操作:
    操作 说明
    get 根据主键查询,查到返回对象,没查到返回None
    get_or_404 根据主键查询,查到返回对象,没查到报404错
    first 返回第一条数据,没有时返回None
    first_or_404 返回第一条数据,没有时报404错
    all 查询所有数据组成的列表
    limit 限制结果集数量,返回时查询对象
    offset 结果集偏移数量,返回时查询对象
    order_by 排序,指定字段后,默认按升序排序(asc),降序(desc),可以指定多个字段
    count 统计个数
  • 聚合函数:max、min、sum、avg、count
    from sqlalchemy import func
    
    @app.route(‘/query/‘)
    def query():
        # 聚合函数
        # max_age = db.session.query(func.max(User.age)).scalar()
        max_age = db.session.query(func.min(User.age)).scalar()
        return str(max_age)
    
  • 指定条件查询
    @app.route(‘/query/‘)
    def query():
        # 指定等值条件
        # users = User.query.filter_by(age=18).all()
        # 指定任意条件
        users = User.query.filter(User.age > 18).all()
        return ‘,‘.join(u.name for u in users)
    

filter条件查询

  • 关系

    >, __gt__:大于
    示例:     # users = User.query.filter(User.age > 20).all()
            # 等价于上式
            users = User.query.filter(User.age.__gt__(20)).all()
    >=,__ge__:大于等于
    <, __lt__:小于
    <=,__le__:小于等于
    ==,__eq__:等于
    !=,__ne__:不等于
    
  • 范围
    users = User.query.filter(User.id.between(1, 3)).all()
    users = User.query.filter(User.id.in_((1, 3, 5))).all()
    users = User.query.filter(User.id.notin_((1, 3, 5))).all()
    
  • 内容
    # 包含指定内容
    # users = User.query.filter(User.email.contains(‘ng‘)).all()
    # 以指定内容开头
    # users = User.query.filter(User.email.startswith(‘fe‘)).all()
    # 以指定内容结尾
    # users = User.query.filter(User.email.endswith(‘.com‘)).all()
    # 模糊匹配
    # users = User.query.filter(User.email.like(‘l%‘)).all()
    users = User.query.filter(User.email.notlike(‘l%‘)).all()
    
  • 逻辑
    from sqlalchemy import and_, or_
    
    # 默认的关系就是逻辑与
    # users = User.query.filter(User.id > 3, User.age > 20).all()
    # 与上式等价
    # users = User.query.filter(and_(User.id > 3, User.age > 20)).all()
    # 逻辑或
    users = User.query.filter(or_(User.id > 3, User.age > 20)).all()
    

    ?

?

原文地址:https://www.cnblogs.com/swjblog/p/9741675.html

时间: 2024-10-01 03:57:51

Flask:05-一首歌的时间掌握flask数据模型(01)的相关文章

Flask:06-一首歌的时间掌握flask数据模型(02)

数据模型 模型关系 一对多(使用最多) 一:学生(Student) 需要添加反向引用 多:文章(Article) 需要添加外键关联 一对一 一:学生(Student),主表 需要添加反向引用,在一对多的情况下多指定属性userlist=False即可 一:详情(Profile),次表 需要添加外键关联 多对多 多:学生(Student) 需要添加反向引用 添加反向引用时需要通过secondary指定中间关联表 设置反向引用的查询时机,可以通过db.backref完成 多:课程(Course) 中

[zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,&quot;经典不忍去的&quot;&quot;最新近流行的&quot;,与你共享~~

如果你是音乐爱好者: 这些歌, 请戴上耳机, 调大音量, 一个人听 ,全世界 都是你的!!!!! (一)这些歌很温暖,没有金属味,适合有阳光的午后,很悠闲... [Anaesthesia]Maximilian Hecker强烈推荐     [Summer Days In Bloom]Maximilian Hecker力推! [end of May]Keren Ann [gotta have you]The Weepies调调很特别,我用它做过背景音乐. [i remember]郭采洁 我喜欢睡觉

goldwave怎么把两首歌合在一起,goldwave使用教学

goldwave是一款非常好用功能强大的音频编辑软件,用户可以使用goldwave录制.编辑.转换音频,可以进行相应的音频处理,制作出自己满意的音频,不过有些朋友不知道怎么用goldwave怎样把两首歌合并在一起,下面安下小编就给大家带来详细的介绍. 1.打开GoldWave软件,依次导入待合成的音乐.导入的步骤为"文件--打开" 2.单击"文件--新建",新建一个空白的音频文件,注意设置时间要比两段音乐的和大一些,这里的格式是"HH:MM:SS.T&qu

人生就像一首歌

很多人 应该看过江苏卫视<非常勿扰>,对<非诚勿扰>里每次嘉宾出场的时候放的那首音乐歌非常熟悉,让人兴奋不已. 今天特意查了下歌名,叫 Can You Feel It 听了之后,觉得一般般,没有收藏的欲望,当然除了那段高潮比较让人兴奋,或许是. 然我想到,人生就是这样子,可能只有在哪个时间段,爆发出惊人四射的魅力或者搞个大事件出来,这时你是最被人接受的,别人看到 你的成功,别人认可你的就是那么一点,其他的方面可能是普普通通,没有任何亮点. 接着,又想到了围城,有人想进去,有人想出来

一个人,一首歌

对“一个人,一首歌”,用面向对象的思路进行了简单的模拟. 下载源码 一个人,一首歌,布布扣,bubuko.com

为王菲写的第三首歌《中华情》

中华情 传说伏羲与女娲交尾,从此有了人类 炎帝和黄帝中原逐鹿灭蚩尤,从此有了炎黄子孙 尧舜禹,夏商周,殷商人把文字刻在甲骨上,从此有了文字记载 初秋战国,屈原孔子孟子和孙子,还有韩非子 秦王嬴政灭六国,苛政猛于虎,孟姜女苦倒八百里长城 陈胜吴广起义,项羽巨鹿大败秦军,刘邦入关中 楚汉之争,项羽兵败乌江,无颜面对江东父老 刘邦建汉朝,从此有了汉字和汉族,匈奴远走欧洲 诸葛亮隆中对出茅庐,三国鼎足成,可惜阿斗扶不起 唐朝盛世无以伦比 马可波罗游历元大都 明朝郑和七次下西洋 唐诗宋词,明清小说,中医草

天黑的时候,我又想起那首歌

開始懂了孙燕资我居然没有调头最残忍那一刻静静看你走一点都不像我原来人会变得温和是透澈的懂了爱情是流动的不由人的何必激动着要理由相信你仅仅是怕伤害我不是骗我非常爱过谁会舍得把我的梦摇醒了宣布幸福不会来了用心酸微笑去原谅了也翻越了有昨天还是好的但明天是自己的開始懂了快乐是选择今天突然又想起了3年前的那首歌曲,那时候整个孙燕姿的磁带像是为我当时的心情量身定做的,每一句歌词都触碰到我心里最柔软的地方,那种滋味在我遇到麦麦后没有想到还会重来,可是3年后的今天,我情不自禁的哼起了那首歌.或许这个时候不该听这

52首歌,一个你

看到朋友分享庄心妍的<热恋之后>,一时兴起,一闭眼,一睁眼,一不小心又让你们看到了我的才华. 接下来Showtime 热 恋 过 后 幸 福 离 我 好 远 心 有 所 爱 一 直 想 着 他 为 情 所 伤 独 自 唱 情 歌 歌 声 里 的 回 忆 掌 心 上 的 时 光 最 后 的 温 柔 乐 在 其 中 越 笑 越 难 过 给 你 机 会 诚 实 没 有 我 的 冬 天 你 会 不 会 冷 后 来 才 发 现 落 单 的 恋 人 孤 单 坠 爱 ( 错 爱 ) 真 的 不 容 易 爱

夜幕降临,我还记得那首歌

我开始明白孙岩资本其实,我做了一个U形转弯最残酷的时刻静静地看着你去所以不像我和是透澈的懂了爱情是流动的不由人的何必激动着要理由相信你仅仅是怕伤害我不是骗我非常爱过谁会舍得把我的梦摇醒了宣布幸福不会来了用心酸微笑去原谅了也翻越了有昨天还是好的但明天是自己的開始懂了快乐是选择今天突然又想起了3年前的那首歌曲.那时候整个孙燕姿的磁带像是为我当时的心情量身定做的,每一句歌词都触碰到我心里最柔软的地方.那种滋味在我遇到麦麦后没有想到还会重来.可是3年后的今天,我情不自禁的哼起了那首歌.或许这个时候不该听