首页IT科技python flask 数据库(flask操作数据库)

python flask 数据库(flask操作数据库)

时间2025-07-10 02:46:52分类IT科技浏览3796
导读:flask操作数据库 准备工作 安装flask-script(版本过高可能会报错 pip install flask-script==2.0.3...

flask操作数据库

准备工作

安装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

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

配置数据库

在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#调试模式 在项目文件下新建一个ext包,在包的init文件内建立映射对象 # 创建一个映射对象 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() 创建完之后,需要将映射对象与app进行关联,在apps包的init文件内进行关联 # 将db(orm映射)对象和app进行关联 db.init_app(app) 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管理 在各蓝图中创建模型(类)时,要用到db的model #在model.py文件中 from exts import db class User(db.Model): 模型的基础创建格式和字段类型 将创建好的模型(自定义的类)导入到app.py文件中 from apps.user.models import User 使用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 降级并删除版本文件

往数据库插入数据

每次插入单挑数据

一次性插入多条数据

# 一次性插入多条数据 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()

查询数据库

filter模糊查询,返回名字结尾字符为g的所有数据。 User.query.filter(User.name.endswith(g)).all() 查询结果为:列表里套着对象 [<User 1>, <User 2>] 查询:filter_by精确查询 返回名字等于wang的所有user User.query.filter_by(name=wang).all() 后面加.first()返回查询到的第一个对象 all()返回查询到的所有对象 get(),参数为主键,如果主键不存在没有返回内容 User.query.get(2) 逻辑非,返回名字不等于wang的所有数据 User.query.filter(User.name!=wang).all() 逻辑或,需要导入or_ from sqlalchemy import or_ User.query.filter(or_(User.name!=wang,User.email.endswith(163.com))).all() 逻辑与,需要导入and,返回and()条件满足的所有数据 from sqlalchemy import and_ User.query.filter(and_(User.name!=wang,User.email.endswith(163.com))).all() not_ 相当于取反 from sqlalchemy import not_ User.query.filter(not_(User.name==chen)).all() 其他 排序order_by limit限制

删除数据

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

更新数据

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

模型表直接的关联

一对多 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() 查询用户所属角色 #查询usersid为3的用户 us1 = User.query.get(3) #查询用户属于什么角色 us1.role 多对多

需要定义一个中间表,包含两个模型的外键字段就可以了,并作为一个“复合主键”

在两个需要做多对多的模型中随便选择一个模型,定义一个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数据库常见的数据类型和字段

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
汝阳seo关键字优化(汝阳seo网站技巧诀窍) 如何优化网站排名(提升网站搜索引擎排名的8个技巧)