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 Use