zoukankan      html  css  js  c++  java
  • Flask入门之SQLAlchemy数据库连接操作(第15讲)

    一、库安装

    Flask-SQLAlchemy    2
    SQLAlchemy    1.0.8

    二、进入venv

    三、切换到项目Sample 文件夹,进入manager.py 的shell

    python manager.py shell

    四、创建data.sqlite数据库

    from app import db
    from app import models
    db.create_all()

      执行完最后一条命令后,在Sampleapp下就会生成一个data.sqlite文件

     

    五、在Pycharm中导入数据库,方便可视化

      Data Source -> Sqlite(Xerial)

      

      然后进行如下操作

      

      点击OK后,会发现已经导入成功了

      

    六、在shell模式下操作数据

      1. 增(写入数据)

    >>> from app import db
    >>> from app import models
    >>> from app.models import User,Role
    >>> admins = Role(name='administrators')
    >>> mod = Role(name='moderator')
    >>> db.session.add(admins)
    >>> db.session.add(mod)
    >>> db.session.commit()
    
    #或者两条一起添加
    #db.session.add([admins,mod])

      注意,对数据库增删改查,都必须进行commit()方法才能写入数据库。

      现在来查看下,到底有没有写入?双击roles表,看到了我们写入的两行记录

      2. 删(删除数据)

    # 说明一下:表的每行记录都是一个对象
    # 例如上面:admins和mod都是对象,name是其属性
    
    >>> admins.name
    u'administrators'
    
    # 为什么说明这点,因为删除行就是删除对象
    
    >>> db.session.delete(admins)
    >>> db.session.commit()
    
    # 删除成功

      3.改(修改数据)  

    # 通过对属性重新赋值,添加,提交事务进行修改数据
    
    mod.name='moderators-new'
    db.session.add(mod)
    db.session.commit()

      4. 查(查询数据)

    # query返回的是包含所有记录的查询对象(BaseQuery)
    >>> Role.query
    <flask_sqlalchemy.BaseQuery object at 0x0000000004936E10>
    
    # query之后如果需要对记录进行条件筛选,要加上过滤函数,返回过滤后的查询对象(BaseQuery),可以多次执行过滤函数
    >>> Role.query.filter_by(name='admins')
    <flask_sqlalchemy.BaseQuery object at 0x0000000004A2C438>
    
    # 过滤函数之后,加执行函数,返回是记录对象(如果是多行怎么办),赋值为一个对象名Admin
    >>> Role.query.filter_by(name='administrators').first()
    <app.models.Role object at 0x0000000004A13F98>
    
    #Admin对象的属性,就相当于单元格的值
    >>> Admin = Role.query.filter_by(name='administrators').first()
    >>> Admin.name
    u'administrators'

     

      5. 表之间的关联

    还记得我们之前定义models.py中的Role和User类时,那个relationship吗,关键是参数backref

    先来看看我们Role表中的对象admins,name=administrator,id为3

    我们知道这个Role表中的id和User表中的role_id(外键)是对应连接的。

    那我们在往User表写入数据的时候,还要写入对应的role_id,有个一步到位的方法,就是把Role行的对象作为参数传给定义类时backref的值(这里是role)

    他就会自动获取id,并传给role_id

      执行代码

    >>> Bikmin = User(name='Bikmin',roles=admins)
    >>> db.session.add(Bikmin)
    >>> db.session.commit()

      看看效果,role_id为3,对应上了

      这里说一下,query()和get()的区别

    1. query() 返回所有记录的查询对象

    2. get() 使用的主键查询

      示例

    >>> Role.query.get(2).name
    u'moderator'

    返回的是moderator,和id一样

       要讲SQLAlchemy查询语句转成原生的SQL语句,只需用str()即可

    str(Role.query.filter_by(name='administrators').all())

      

       如果在第一次使用shell会话的时候,创建了行的Python对象,那么再关闭Shell后,再打开,这些对象不能再使用,必须重新创建

    admins = Role.query.filter_by(name='administrators').first()

    参考文章:选择(Select),插入(Insert), 删除(Delete)

  • 相关阅读:
    react.js
    shell if,case,for,while语法
    shell判断文件类型和权限
    shell编程之sed语法
    php魔术方法__SET __GET
    git 忽略文件.gitignore
    php设置错误,错误记录
    linux ifconfig显示 command not found
    数据库备份与恢复
    mysql主要技术
  • 原文地址:https://www.cnblogs.com/wongbingming/p/6831448.html
Copyright © 2011-2022 走看看