当前位置:   article > 正文

Flask框架 之Flask-SQLAlchemy操作数据库

flask_sqlalchemy 操作数据库

一、代码

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from sqlalchemy import desc
  4. class Config(object):
  5. ''' sqlalchemy 参数配置 '''
  6. # 配置数据库
  7. SQLALCHEMY_DATABASE_URI = 'mysql://test01:123456@127.0.0.1:3306/test01?charset=utf8'
  8. # 自动会追踪对象的修改并且发送信号
  9. SQLALCHEMY_TRACK_MODIFICATIONS = True
  10. # 输出sql语句
  11. SQLALCHEMY_ECHO = True
  12. app = Flask(__name__)
  13. # 载入数据库配置
  14. app.config.from_object(Config)
  15. # 创建sqlalchemy工具对象
  16. db = SQLAlchemy(app)
  17. class User(db.Model):
  18. __tablename__ = 'user'
  19. id = db.Column(db.Integer, primary_key=True)
  20. username = db.Column(db.String(32), unique = True)
  21. email = db.Column(db.String(255), unique = True)
  22. role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
  23. class Role(db.Model):
  24. __tablename__ = 'role'
  25. id = db.Column(db.Integer, primary_key=True)
  26. name = db.Column(db.String(32), unique = True)
  27. user = db.relationship('User')
  28. if __name__ == '__main__':
  29. # 删除所有表
  30. db.drop_all()
  31. # 创建所有表
  32. db.create_all()
  33. # 创建数据
  34. role1 = Role(name = '管理员')
  35. db.session.add(role1)
  36. db.session.commit()
  37. role2 = Role(name = '普通用户')
  38. db.session.add(role2)
  39. db.session.commit()
  40. u1 = User(username='admin', email='admin@example.com', role_id=role1.id)
  41. u2 = User(username='peter', email='peter@example.com', role_id=role2.id)
  42. db.session.add_all([u1, u2])
  43. db.session.commit()
  44. # 查询数据
  45. for r in db.session.query(Role).order_by(desc(Role.id)).all():
  46. print(r.name)
  47. u = User.query.filter_by(id=1).first()
  48. print(u)
  49. app.run()

二、分页器paginate

 paginate 属性:
    print(paginate.pages) #总共能生成多少页
    print(paginate.page) #当前页码数
    print(paginate.has_next) #True
    print(paginate.has_prev) #Flase
    print(paginate.next_num) #获取下一页的页码数
    print(paginate.prev_num) #获取上一页的页码数
    print(paginate.items) #获当前页的对象 列表

三、filter与filter_by的用法

模型类.query.fillter_by(字段名=值) 里面是布尔的条件   这个无法实现复杂查询

模型类.query.fillter(模型类.字段名==值) 里面是布尔的条件   【常用】

四、复杂查询

模型类.query.fillter(模型类.字段名.endswith('z')).all() 等价于 select * from user where 字段名 like '%z'

模型类.query.fillter(模型类.字段名.startswith('z')).all() 等价于 select * from user where 字段名 like 'z%';

模型类.query.fillter(模型类.字段名.contains('z')).all() 等价于 select * from user where 字段名 like '%z%';

模型类.query.fillter(模型类.字段名.like('%z%')).all() 等价于 select * from user where 字段名 like '%z%';

模型类.query.fillter(模型类.字段名.in_(['a','b','c'])).all() 等价于 select * from user where 字段名  in ('a','b','c');

模型类.query.fillter(模型类.字段名.between(开始,结束)).all() 等价于 select * from user where 字段名  between 开始 and  结束;

模型类.query.fillter(or_(模型类.字段名.like('z%'),模型类.字段名.contains('a'))).all() 等价于 select * from user where 字段名 like 'z%' or 字段名 like '%a%';

模型类.query.fillter(and_(模型类.字段名.like('z%'),模型类.字段名 < '2021-12-12 00:00:00')).all() 等价于 select * from user where 字段名 like 'z%' and 字段名 < '2021-12-12 00:00:00';

模型类.query.fillter(and_(模型类.字段名.like('z%'),模型类.字段名.__lt__( '2021-12-12 00:00:00'))).all() 等价于 select * from user where 字段名 like 'z%' and 字段名 < '2021-12-12 00:00:00';

模型类.query.fillter(not_(模型类.字段名.contains('a'))).all() 等价于 select * from user where 字段名  not like '%a%' ;

模型类.query.order_by (模型类.字段名).offset(2).limit(2).all() 

>       __gt__ 

 >=     __ge__(gt equal)

<=     __le__(lt euqal)

!=      not_

五、排序

模型类.query.order_by (模型类.字段名.desc()).all() 等价于 select * from user order by 字段名 desc;

六、多对多的多条件查询

  1. ''' 标签 '''
  2. class Tag(db.Model, Base):
  3. __tablename__ = "blog_tag"
  4. id = db.Column(db.Integer, primary_key=True)
  5. tagname = db.Column(db.String(32), unique=True)
  6. article_tags = db.Table(
  7. "blog_article_tag",
  8. db.Column("tag_id", db.ForeignKey("blog_tag.id")),
  9. db.Column("article_id", db.ForeignKey("blog_article.id"))
  10. )
  11. ''' 文章 '''
  12. class Article(db.Model, Base):
  13. __tablename__ = "blog_article"
  14. id = db.Column(db.Integer, primary_key=True)
  15. # 发布人
  16. admin_id = db.Column(db.Integer, db.ForeignKey("blog_admin.id"))
  17. # 文章标题
  18. title = db.Column(db.String(32))
  19. # 作者
  20. author = db.Column(db.String(32))
  21. # 文章描述
  22. description = db.Column(db.String(255))
  23. # 文章关键词
  24. keywords = db.Column(db.String(255), default='')
  25. # 文章内容
  26. content = db.Column(db.Text)
  27. # 文章缩略图
  28. pic = db.Column(db.String(255))
  29. # 文章点击数
  30. click = db.Column(db.Integer, default = 0)
  31. # 是否推荐
  32. is_state = db.Column(db.SmallInteger, default=0)
  33. # 所属栏目
  34. category_id = db.Column(db.Integer, db.ForeignKey("blog_category.id"))
  35. tags = db.relationship("Tag", secondary = article_tags, backref="article")
  1. @home_search.route("/index")
  2. def index():
  3. page = request.args.get('page', 1, type=int)
  4. tid = request.args.get('tid', 0, type=int)
  5. keywords = request.args.get('keywords', '', type=int)
  6. article = Article.query.join(Tag, Article.tags)
  7. if keywords:
  8. article = article.filter(Article.title.like('%'+keywords+'%'))
  9. if tid:
  10. article = article.filter(Tag.id==tid)
  11. try:
  12. pagination = article.order_by(Article.id.desc()).paginate(page = page, per_page=PAGE_LIMIT)
  13. except Exception as e:
  14. flash(str(e))
  15. abort(500)
  16. return render_template("home/search.html",pagination=pagination, keywords=keywords)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/510760
推荐阅读
相关标签
  

闽ICP备14008679号