flask操作数据库

flask操作数据库

准备工作

  1. 安装flask-script(版本过高可能会报错)
pip install flask-script==2.0.3

使用flask-script里的Manager类实例化来管理项目的启动等

from apps import create_app
from flask_script import Manager

app = create_app()

manager = Manager(app=app)

if __name__ == '__main__':
    # 运行app模块
    manager.run()

在启动项目时由原来的python app.py 改成了python app.py runserver

  1. 安装pymysql
pip install pymysql
  1. 安装flask-sqlalchemy
pip install flask-sqlalchemy
  1. 安装flask-migrate,版本过高可能出现问题
pip install flask-migrate==2.7.0

配置数据库

  1. 在settings里配置一下数据库连接路径
class DevelopmentConfig:
    ENV = 'development' # 设置环境为开发环境
    DEBUG = True  # 设置debug为true
    SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root@127.0.0.1:3306/flaskday05'#访问的数据库+用的驱动://数据库的用户名:密码@服务器地址:端口号/数据库
    # 设置sqlalchemy不自动更跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS=False
    SQLALCHEMY_ECHO=True#调试模式
  1. 在项目文件下新建一个ext包,在包的init文件内建立映射对象
# 创建一个映射对象
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
  1. 创建完之后,需要将映射对象与app进行关联,在apps包的init文件内进行关联
    # 将db(orm映射)对象和app进行关联
    db.init_app(app)
  1. flask-migrate是一个为Flask应用处理SQLAlchemy数据库迁移的扩展,使得可以通过Flask的命令行接口或者Flask-Scripts对数据库进行操作。
#在app.py文件中,当创建完app对象之后
from flask_migrate import Migrate, MigrateCommand
migrate=Migrate(app=app,db=db)#建立app影响数据库的映射
manager.add_command('db',MigrateCommand)#将命令交给manager管理
  1. 在各蓝图中创建模型(类)时,要用到db的model
#在model.py文件中
from exts import db
class User(db.Model):
  1. 模型的基础创建格式和字段类型

image

  1. 将创建好的模型(自定义的类)导入到app.py文件中
from apps.user.models import User
  1. 使用terminal运行flask项目
初始化(一个项目只需要初始化一次,用来生成migrations文件夹)python app.py db init
更新版本(每次修改后要运行,用来在versions文件中生成最新的版本py文件)python app.py db migrate
数据库同步(每次修改要运行,用来将最新版本的内容更新到数据库上)python app.py db upgrade
删除时:python app.py db downgrate 降级并删除版本文件

往数据库插入数据

每次插入单挑数据

image

一次性插入多条数据

    # 一次性插入多条数据
    user1 = User(name='wang',email='wang@163.com',pswd='123456',role_id=role1.id)
    user2 = User(name='zhang',email='zhang@189.com',pswd='201512',role_id=role2.id)
    user3 = User(name='chen',email='chen@126.com',pswd='987654',role_id=role2.id)
    user4 = User(name='zhou',email='zhou@163.com',pswd='456789',role_id=role1.id)
    db.session.add_all([user1,user2,user3,user4])
    db.session.commit()

查询数据库

  1. filter模糊查询,返回名字结尾字符为g的所有数据。
User.query.filter(User.name.endswith('g')).all()

查询结果为:列表里套着对象
[<User 1>, <User 2>]
  1. 查询:filter_by精确查询
返回名字等于wang的所有user
User.query.filter_by(name='wang').all()

后面加.first()返回查询到的第一个对象
all()返回查询到的所有对象
  1. get(),参数为主键,如果主键不存在没有返回内容
User.query.get(2)
  1. 逻辑非,返回名字不等于wang的所有数据
User.query.filter(User.name!='wang').all()
  1. 逻辑或,需要导入or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()
  1. 逻辑与,需要导入and,返回and()条件满足的所有数据
from sqlalchemy import and_
User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()
  1. not_ 相当于取反
from sqlalchemy import not_
User.query.filter(not_(User.name=='chen')).all()
  1. 其他

image

  1. 排序order_by

image

  1. limit限制

image

删除数据

user = User.query.first()
db.session.delete(user)
db.session.commit()

更新数据

user = User.query.first()
user.name = 'dong'
db.session.commit()

模型表直接的关联

  1. 一对多
class Role(db.Model):
    ...
    #关键代码
    user = db.relationship('User', backref='role', lazy='dynamic')
    ...

class User(db.Model):
    ...
    role = db.Column(db.Integer, db.ForeignKey('roles.id'))
  • 其中realtionship描述了Role和User的关系。在此文中,第一个参数为对应参照的类"User"
  • 第二个参数backref表示当使用user对象反向查询时,使用user.role查询到role表中的数据
  • 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载外键模型数据

如果设置为子查询方式(subquery),则会在加载完Role对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢
设置为 subquery 的话,role.users 返回所有数据列表
另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式
设置为 dynamic 的话,role.users 返回查询对象,并没有做真正的查询,可以利用查询对象做其他逻辑,比如:先排序再返回结果

关联查询

角色和用户的关系是一对多的关系,一个角色可以有多个用户,一个用户只能属于一个角色。

  • 查询角色的所有用户
#查询roles表id为1的角色
ro1 = Role.query.get(1)
#查询该角色的所有用户
ro1.use.all()
  • 查询用户所属角色
#查询users表id为3的用户
us1 = User.query.get(3)
#查询用户属于什么角色
us1.role
  1. 多对多

需要定义一个中间表,包含两个模型的外键字段就可以了,并作为一个“复合主键”
在两个需要做多对多的模型中随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系,在使用relationship的时候,需要传入一个secondary=中间表模型名。

# 中间表,也可以重新定义一个类class,表示中间表
article_tag = db.Table(
    'article_tag',
    db.Column('article_id', db.Integer,db.ForeignKey("article.id"),primary_key=True),
    db.Column('tag_id', db.Integer, db.ForeignKey("tag.id"), primary_key=True)
)
# 文章表
class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64))
    tags = db.relationship('Tag', secondary=article_tag, backref=db.backref('articles'))
	# 这里需要指定一个参数secondary,值为中间表的表名
# 标签表
class Tag(db.Model):
    __tablename__ = 'tag'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

多对多关系的查询
1.查询文章所有的标签:
article = Article.query.filter(Article.title=="xxx").first()
tags = article.tags

2.查询一个标签涉及的所有文章:
tag = Tag.query.get(2)
articles = tag.articles

flask数据库常见的数据类型和字段

image

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:flask操作数据库 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • celery的介绍和使用

    celery介绍 celery是一个异步任务框架,它可以执行异步任务、延迟任务、定时任务 异步任务框架简述: 1)celery可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) 2)celery服务为为其他项目服务提供异步解决任务需求的 注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给cel…

    2023年4月2日
    00
  • 个人站点页面搭建和侧边栏展示功能

    展示个人站点页面 前端代码:和首页文章展示基本一样: <div class=”col-md-8″> {% for article in article_list %} <ul class=”media-list”> <li class=”media”> <a href=””><h4 class=”medi…

    Python开发 2023年4月2日
    00
  • 实时展示用户上传的头像

    实时展示用户上传的头像 总体思路 “”” 1.首先需要给对应的上传头像input框绑定一个文本域变化事件 (当检测到用户对该文件框上传了头像就会触发一系列操作) 2.再生成一个文件阅读器对象 3.再获取用户上传的文件头像 4.把用户上传的文件头像交给文件阅读器对象FileReader读取 5.利用文件阅读器把读取的文件头像结果展示到前端页面 (修改img的s…

    Python开发 2023年4月2日
    00
  • drf接口文档

    接口文档 接口编写已经写完了,需要编写接口文档,给前端的人使用 -请求地址 -请求方式 -支持的编码格式 -请求参数(get,post参数) -返回格式示例 在公司的写法 1)直接使用word或者md写2)使用接口文档平台,在接口文档平台录入(Yapi(百度开源的自己搭建),第三方平台(收费),自己开发接口文档平台) -https://www.showdoc…

    2023年4月2日
    00
  • input与print语法

    1.input输入语法 input是用来接收用户输入的一种语法,实现计算机与用户之间的交互,改方法有一个返回值,返回的是用户输入的字符串! 语法:res = input(‘请输入您的账号:’) 在python3中,用户输入的数据类型将会被全部转成字符串类型。在python2中,用户输入什么数据类型,程序就会转成什么类型,指的注意的是,用户假如输入的数据类型错…

    Python开发 2023年4月2日
    00
  • 登录注册接口搭建

    登录接口分析 登录分为多方式登录和验证码登录方式 多方式登录 1)前台提供账号密码,账号可能是 用户名、手机号、邮箱等 接口: 后台只需要提供一个多方式登录接口即可 – 多方式登录接口 多方式登录接口 前端输入完账号和密码,点击登录,向后端发送请求进行校验用户登录数据 urls.py from django.urls import path,re_path,…

    Python开发 2023年4月2日
    00
  • 文章的评论(跟评论与子评论的制作)

    文章的评论制作 先做跟评论,在做子评论 发表评论框的制作:前端渲染发表评论框: {# 评论功能开始#} {% if request.user.is_authenticated %} <div> <p><span class=”glyphicon glyphicon-comment”>发表评论:</span>&l…

    2023年4月2日
    00
  • git的介绍和使用

    git介绍 什么是git git是一种版本控制器 – 控制的对象是开发的项目代码 什么是版本控制器 完成 协同开发 项目,帮助程序员整合代码 i)帮助开发者合并开发的代码 ii)如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 软件:SVN 、 GIT(都是同一个人的个人项目) github、gitee(两个采用git版本控制器管理代码的公…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部