【flask】flask-sqlalchemy使用 flask-migrate使用 flask项目演示

发布时间 2023-04-11 17:26:27作者: passion2021

昨日回顾

类装饰器可能有两种含义:

  1. 使用类作为装饰器
  2. 装饰类的装饰器

image-20230411093407900

基本增删查改:单表

# 0 sqlalchemy创建表:Base = declarative_base()
	-只能创建和删除
    -不能创建数据库
    -不能修改表
    
# 1 快速插入数据
	-借助于session对象
    	from sqlalchemy.orm import sessionmaker
        Session=sessionmaker(bind=engine)
        session=Session() #会话,连接
        session.add(表模型的对象)
        session.add_all([对象,对象])
        session.commit()
        session.close()
     -session.close没有将连接断开,而是将链接放入连接池中。   
       
# 2 多线程情况下,并发安全问题
	-全局就用一个session
    -scoped_session可以保证并发情况下,session的安全
    -scoped_session类,内部有个local对象,把session放到了local中
    -全局就使用一个session,会有并发安全的问题。
    -每个session就使用当前线程的,如果当前线程没有session就新建一个,放在local对象中。
    
# 3 类装饰器
	-装饰类的装饰器:加在类上的装饰器,昨天讲过了
    -类作为装饰器用:
    # 类作为装饰器来用
    class Wrapper():
        def __init__(self, func):
            self.func = func

        def __call__(self, *args, **kwargs):
            # 前面加代码
            print('我在你前面')
            res = self.func(*args, **kwargs)
            # 后面加代码
            print('我在你后面')
            return res


    @Wrapper  # add=Wrapper(add)--->触发Wrapper的__init__---->现在add是Wrapper类的对象
    def add():
        print('add')
        
        
# 4 基本增删查改:单表
	-增:add add_all
    -查:filter:表达式,filter_by:具体值
    -删:查出来.delete()
    -改:
    	查出来.update({'name':"lqz"})
    	查出来.update({User.name:"lqz"})
        对象.name='lqz'
        add(对象)
        
        
# 5 高级查询
	-in
    -between
    -like
    -排序
    -分页
    -原生sql
    -分组。。。
    
    
# 6 一对多关系的建立
	Person :hobby_id,hobby
    Hobby
    
    -新增,基于对象的新增
    -基于对象的跨表正向反向
# 7 多对多
	GIrl
    Boy
    Boy2Girl
    -新增
    -基于对象的跨表查询
# 8 连表查询
	res = session.query(Person, Hobby).filter(Person.hobby_id == Hobby.id).all()
    session.query(Person).join(Hobby).all()

今日内容

1 flask-sqlalchemy使用

# 集成到flask中,直接使用sqlalchemy,看代码
# 有个第三方flask-sqlalchemy,帮助咱们快速的集成到flask中
# flask-sqlalchemy实际上是将sqlalchemy那一套再封装在了一个对象里。
# engine链接的部分放在配置文件拿,就不需要每次都写engine连接部分的代码了。

# sqlalchemy中也可以使用序列化类,要安装第三方模块flask-restful。

# 使用flask-sqlalchemy集成
	1 导入 from flask_sqlalchemy import SQLAlchemy
    2 实例化得到对象
    	db = SQLAlchemy()
    3  将db注册到app中
    	db.init_app(app)
    4 视图函数中使用session
    	全局的db.session  # 线程安全的
    5 models.py 中继承Model
    	db.Model
    6 写字段 
    	username = db.Column(db.String(80), unique=True, nullable=False)
    7 配置文件中加入
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root@127.0.0.1:3306/ddd?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 5
    SQLALCHEMY_POOL_TIMEOUT = 30
    SQLALCHEMY_POOL_RECYCLE = -1
    # 追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = False

2 flask-migrate使用

原生的sqlalchemy,不支持修改表。
如果我们想实现类似于django的功能:表发生变化,都会有记录,自动同步到数据库。需要安装第三方模块flask-migrate。

# 表发生变化,都会有记录,自动同步到数据库中
# 原生的sqlalchemy,不支持修改表的
# flask-migrate可以实现类似于django的
	python manage.py makemigrations #记录
    python manage.py migrate        #真正的同步到数据库

    
# 使用步骤
	0 flask:2.2.2   flask-script:2.0.3  
	1 第一步:安装,依赖于flask-script
    	pip3.8 install flask-migrate==2.7.0
    2 在app所在的py文件中
    	from flask_script import Manager
		from flask_migrate import Migrate, MigrateCommand
        manager = Manager(app)
        Migrate(app, db)
        manager.add_command('db', MigrateCommand) 
        
        manager.run() # 以后使用python manage.py runserver 启动项目
        
    3 以后第一次执行一下
    	python manage.py db init  # 生成一个migrations文件夹,里面以后不要动,记录迁移的编号
        
    4 以后在models.py 写表,加字段,删字段,改参数
    
    5 只需要执行
    	python manage.py db migrate  # 记录
        python manage.py db upgrade  # 真正的同步进去

3 flask项目演示

# 0 创建数据库 movie
# 1 pycharm打开项目
# 3 在models中,注释,解开注释,右键执行,迁移表
# 4 在models中恢复成原来的
# 5 在命令行中python manage.py runserver运行项目
# 6 访问前台和后台