当前位置:   article > 正文

Flask框架(SQLAlchemy(python3版本)中查询数据的方法,以及定义显示信息 )_db.session.query all 怎么解析

db.session.query all 怎么解析

(SQLAlchemy中添加数据 )https://blog.csdn.net/wei18791957243/article/details/85256848 

    添加数据,添加好的表

     

SQlalchemy数据库查询

1. 查询数据

     (1) 查询表中的所有数据:    模型类.query.all()    # 返回每个数据的对象的列表

           例如:   li = Role.query.all()    # 保存的是数据的对象,列表形式      Role 是一个模型类

                          li[0]   #   取第一个数据对象

                        li[0].name   # 就取出了第一个数据对象的name属性,即在数据库中的列名为name的第一个值

    (2)查询第一条数据:

               r = Role.query.first()     #   查询到第一个条数据的对象

               r.name                 #  然后取出相应的值

              还有一种方法:  按照主键的值来进行查询一条数据

              r = Role.query.get(2)           #    2  即查询出主键为2  的那条数据的对象

              r.name     #  然后取出相应的值

    (3)  利用db.session 的方式查询       

          查询多条

               db.session.query(模型类).all()         # 返回的是一个数据对象列表   、

         查询第一条

               db.session.query(模型类).first()         # 返回的是第一个数据对象

         查询其中的一条

            db.session.query(模型类).get(主键的值)         # 返回的是一个数据对象

    2.   查询数据的时候进行过滤

       (1)  模型类.query_filter_by(name="wang").all   # 查询出name为wang的数据对象,返回的是一个列表,然后可以根                    据属性来获取相应的值                 也可以.first()  

               如果还有其他的条件,直接以逗号分隔在filter_by()里面添加就行

              如果查询的数据不存在返回None

     (2) 模型类.query_filter(模型类.name=="wang").all    #   需要指名  模型类.属性    ,并且是双等号

     (3)   查询时使用    “或”  以及模糊查询endswith()

                   导入模块  :  from sqlalchemy import or_

                 #   如下:   查询出 User模型类中的name属性等于“wang”或者email属性是以163.com结尾的数据对象

                 User.query.filter(or_(User.name=="wang",User.email.endswith("163.com"))).all()      #  返回列表

      (4)offset()   # 偏移:从第几条开始查询,  limit  ()  #   表示取几条

         User.query.offset(2).limit(2).all     #   查询,从表中第二条数据开始查询,查询出的结果取两个,返回数据对象列表

       可以一起用,也可分开来用

     (5) flask中的排序查询

      默认是升序(asc()可以不用写:      User.query.order_by(User.id).all()     #  User 是模型类,通过User中的id进行排序

       降序:  desc()   

           User.query.order_by(User.id.desc()).all()       #  直接在要按什么排序的后面,desc()  的方式,进行降序排序

      (6)  查询时,group_by 的使用

               如果要 用到聚合函数   则要导入     

               from sqlalchemy import func

             #   分组统计出  User模型类中 表中的 role_id的每个数据的次数

              db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id).all()    # 返回查询的结果列                表不是数据的对象了

      (7)  关联查询

            在模型类里面添加了relationship(), 关联了另外一模型类,

           在Role的模型类中,创建了属性  users = db.relationship("User",backref="role") ,关联了另外一个User的模型类

                  ( 1)从Role往User里面查询

                              ro = Role.query.get(1)  # 获取到了,Role中的一 个数据对象

                             直接 ro.user  就可以把Role表中的相对应在User中数据对象取出来

                   (2 ) 从User往Role里面查询

                              user = User.query.get(1)

                              直接在user.role就可以查询到Role表中相对应的数据对象

       (8)定义显示信息

               在模型类中,重写   __repr__   方法,  

  1. def __repr__(self):
  2. """定义之后,可以让显示对象的时候更直观"""
  3. return "User object : name=%s" % self.name

 

 db_demp.py

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. app = Flask(__name__)
  4. class Config(object):
  5. """配置参数"""
  6. '''sqlalchemy的配置参数'''
  7. SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://root:123456@127.0.0.1:3306/db_python"
  8. '''设置sqlalchemy自动跟踪数据库'''
  9. SQLALCHEMY_TRACK_MODIFICATIONS = True
  10. # 设置参数
  11. app.config.from_object(Config)
  12. '''创建数据库 sqlalchemy 工具对象'''
  13. db = SQLAlchemy(app)
  14. """
  15. 创建数据库模型类(继承 sqlalchemy 工具对象中的Model类),一个模型类对应一张模型表
  16. 数据库表名的常见规范:
  17. (1) 数据库名缩写_表名 (2) tbl_表名
  18. """
  19. class Role(db.Model):
  20. """用户身份表"""
  21. __tablename__ = "tbl_roles"
  22. id = db.Column(db.Integer, primary_key=True)
  23. name = db.Column(db.String(32), unique=True)
  24. '''
  25. relationship() :第一个参数表明这个关系的另一端是哪个模型(类)
  26. 把两个表关联在一起,不添加也是可以的,根据自己的需求
  27. backref : 在关系的另一模型中添加反向引用
  28. 相当于给要关联的表添加一个role属性
  29. 不添加也是可以的,根据自己的需求
  30. '''
  31. user = db.relationship("User", backref="rpp") # 从模型类中
  32. def __repr__(self):
  33. """定义之后,可以让显示对象的时候更直观"""
  34. return "Role object : name=%s" % self.name
  35. class User(db.Model):
  36. """用户表"""
  37. __tablename__ = "tbl_users" # 指明数据库的表名
  38. id = db.Column(db.Integer, primary_key=True) # 整型的主键,会默认设置为自增主键
  39. name = db.Column(db.String(64), unique=True)
  40. email = db.Column(db.String(128), unique=True)
  41. password = db.Column(db.String(128))
  42. # db.ForeignKey 外键关联
  43. # User类中添加了一个role_id变量,数据类型db.Integer,第二个参数指定外键是哪个表中哪个id。
  44. role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id")) # 从底层中
  45. def __repr__(self):
  46. """定义之后,可以让显示对象的时候更直观"""
  47. return "User object : name=%s" % self.name
  48. if __name__ == '__main__':
  49. '''清除数据库中的所有数据'''
  50. db.drop_all()
  51. '''创建所有表'''
  52. db.create_all()
  53. # 给用户身份表中添加两个数据
  54. '''创建一个对象'''
  55. role1 = Role(name="admin")
  56. '''在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。会话用db.session表示'''
  57. '''session 记录对象任务 '''
  58. db.session.add(role1)
  59. '''提交任务到数据库中'''
  60. db.session.commit()
  61. role2 = Role(name="stuff")
  62. db.session.add(role2)
  63. db.session.commit()
  64. # 给用户表中添加数据
  65. us1 = User(name='wang', email='wang@163.com', password='123456', role_id=role1.id)
  66. us2 = User(name='zhang', email='zhang@189.com', password='452342', role_id=role2.id)
  67. us3 = User(name='chen', email='chen@126.com', password='782677', role_id=role2.id)
  68. us4 = User(name='zhou', email='zhou@163.com', password='858585', role_id=role1.id)
  69. '''一次性添加多条数据'''
  70. db.session.add_all([us1, us2, us3, us4])
  71. db.session.commit()

 然后在ipython中导入py文件

  1. """导入相关的py文件"""
  2. In [1]: from db_demo import *
  3. In [2]: Role.query.all()
  4. Out[2]: [<Role 1>, <Role 2>]
  5. In [3]: li = Role.query.all()
  6. In [4]: li
  7. Out[4]: [<Role 1>, <Role 2>]
  8. In [5]: r = li[0]
  9. In [6]: type(r)
  10. Out[6]: db_demo.Role
  11. In [7]: r.name
  12. Out[7]: 'admin'
  13. In [8]: Role.query.first()
  14. Out[8]: <Role 1>
  15. In [9]: r.name
  16. Out[9]: 'admin'
  17. """# 根据主键id获取对象"""
  18. In [10]: r = Role.query.get(2)
  19. In [11]: r
  20. Out[11]: <Role 2>
  21. In [12]: r.name
  22. Out[12]: 'stuff'
  23. """另一种查询方式"""
  24. In [13]: db.session.query(Role).all()
  25. Out[13]: [<Role 1>, <Role 2>]
  26. In [14]: db.session.query(Role).get(2)
  27. Out[14]: <Role 2>
  28. In [15]: db.session.query(Role).first()
  29. Out[15]: <Role 1>
  30. In [16]: User.query.filter_by(name="wang")
  31. Out[16]: <flask_sqlalchemy.BaseQuery at 0x276d8975eb8>
  32. In [18]: User.query.filter_by(name="wang").all()
  33. Out[18]: [<User 1>]
  34. In [19]: User.query.filter_by(name="wang").first()
  35. Out[19]: <User 1>
  36. In [20]: user = User.query.filter_by(name="wang").first()
  37. In [21]: user.name
  38. Out[21]: 'wang'
  39. In [22]: user.email
  40. Out[22]: 'wang@163.com'
  41. In [23]: User.query.filter_by(name="wang", role_id=1).first()
  42. Out[23]: <User 1>
  43. In [24]: User.query.filter_by(name="wang", role_id=2).first()
  44. """没有该数据时,返回的是空"""
  45. In [25]: user = User.query.filter_by(name="wang", role_id=2).first()
  46. In [26]: type(user)
  47. Out[26]: NoneType
  48. In [27]: user = User.query.filter(User.name=="wang", User.role_id==1).first()
  49. In [28]: user
  50. Out[28]: <User 1>
  51. In [29]: user.name
  52. Out[29]: 'wang'
  53. """模糊查询"""
  54. In [30]: from sqlalchemy import or_
  55. In [31]: User.query.filter(or_(User.name=="wang", User.email.endswith("163.com"))).all()
  56. Out[31]: [<User 1>, <User 4>]
  57. In [32]: li = User.query.filter(or_(User.name=="wang", User.email.endswith("163.com"))).all()
  58. In [33]: li[0].name
  59. Out[33]: 'wang'
  60. In [34]: li[1].name
  61. Out[34]: 'zhou'
  62. """offset偏移 即跳过几条"""
  63. In [35]: User.query.offset(2).all()
  64. Out[35]: [<User 3>, <User 4>]
  65. In [36]: li = User.query.offset(2).all()
  66. In [37]: li[0].name
  67. Out[37]: 'chen'
  68. In [38]: li[1].name
  69. Out[38]: 'zhou'
  70. In [39]: li = User.query.offset(1).limit(2).all()
  71. In [40]: li
  72. Out[40]: [<User 2>, <User 3>]
  73. In [41]: li[0].name
  74. Out[41]: 'zhang'
  75. In [42]: li[1].name
  76. Out[42]: 'chen'
  77. """排序查询"""
  78. In [43]: User.query.order_by("id").all()
  79. Out[43]: [<User 1>, <User 2>, <User 3>, <User 4>]
  80. In [44]: li = User.query.order_by(User.id.desc()).all()
  81. In [45]: li
  82. Out[45]: [<User 4>, <User 3>, <User 2>, <User 1>]
  83. In [46]: li[0].name
  84. Out[46]: 'zhou'
  85. In [47]: li[1].name
  86. Out[47]: 'chen'
  87. """分组查询"""
  88. In [48]: from sqlalchemy import func
  89. In [49]: db.session.query(User.role_id, func.count(User.role_id)).group_by(User.role_id).all()
  90. Out[49]: [(1, 2), (2, 2)]

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/619301
推荐阅读
相关标签
  

闽ICP备14008679号