flask-sqlalchemy,flask-migrate

发布时间 2023-04-11 18:59:55作者: 李阿鸡

flask-sqlalchemy使用

把sqlalchemy集成到flask中使用

models

# 导入
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index

Base = declarative_base()

class Book(Base):
    __tablename__= 'books'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))

if __name__ == '__main__':
    # 创建引擎对象
    engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/ddd')
    # 同步到数据库
    Base.metadata.create_all(engine)

封装sqlalchemy session对象

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session

engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/ddd')
Session = sessionmaker(bind=engine)

session = scoped_session(Session)

在flask视图函数导入使用

from flask import Flask
from session_py import session
from models import Book
app = Flask(__name__)


@app.route('/')
def index():
    session.add(Book(name='金瓶没'))
    session.commit()
    session.close()
    return '增加成功'

if __name__ == '__main__':
    app.run()

这样过于繁琐,有个第三方

flask-sqlalchemy 帮助咱们快速的集成到flask中

安装

pip install flask-SQLAlchemy

导入

from flask_sqlalchemy import SQLAlchemy

配置数据库链接

app.config.from_pyfile('settings.py')

新建一个settings

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123@127.0.0.1:3306/ddd?charset=utf8"
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_POOL_TIMEOUT = 30
SQLALCHEMY_POOL_RECYCLE = -1
# 追踪对象的修改并且发送信号
SQLALCHEMY_TRACK_MODIFICATIONS = False

实例化得到db对象

db = SQLAlchemy()

注册app

db.init_app(app)

以后建模型表都继承db.model 写字段类型都用db开头,sqlalchemy session也用db开头


from flask_sqlalchemy1 import db
class Book(db.Model):
    __tablename__ = 'books'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

from flask import Flask
# 导入flask_sqlalchemy
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
# 配置数据库连接用文件
app.config.from_pyfile('settings.py')
# 实例化得到db对象
db = SQLAlchemy()
# 将db注册到app上
db.init_app(app)


@app.route('/')
def index():
    from models import Book  # 有循环导入问题,用flask项目就不会了
    db.session.add(Book(name='西游记'))
    db.session.commit()
    return '增加成功'


if __name__ == '__main__':
    app.run()

flask-migrate

可以实现与django一样的python manage.py makemigrations 与migrate的命令, 原本的sqlalchemy不可以 删除或修改字段,通过这个就可以实现。

注意版本

Flask:2.2.2   flask-script:2.0.3 

安装

pip3.8 install flask-migrate==2.7.0

项目目录

sansa
	views
       __init__.py  # 实例化得到db对象并写create_app函数 返回app
       models.py   #  导入db对象 写表模型
   manage.py      #  导入init的create_app方法产生含有db的app,使用flask-script 定制命令,使用flask_migrate的Migrate 包裹一下 db 和app 把命令增加到flask-script中取
   settings.py

init.py


from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 第一步:类实例化得到对象
db = SQLAlchemy()

from .models import *
from .views import account

def create_app():
    app = Flask(__name__)
    app.config.from_object('settings.DevelopmentConfig') # 配置数据库连接环境
    #第二步: 将db注册到app中
    db.init_app(app)
    # 注册蓝图
    app.register_blueprint(account.account)
    return app

settings



class BaseConfig(object):

    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


class ProductionConfig(BaseConfig):
    pass


class DevelopmentConfig(BaseConfig):
    pass


class TestingConfig(BaseConfig):
    pass

models


from . import db
# 第三步:把db导入,直接继承db.Model

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    # email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %s>' % self.username

manage.py

"""
     python3 manage.py db init   只执行一次,初始化的时候使用  会在项目路径下生成migrations文件夹,用来管理表变化
     python3 manage.py db migrate  等同于django的makemigrations,只是做个记录
     python3 manage.py db upgrade  等同于django的migrate把变化同步到数据库中
"""
from sansa import create_app
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from sansa import db

app = create_app()
# flask-script的使用
# 第一步:初始化出flask_script的manage
manager = Manager(app)
# 第二步:使用flask_migrate的Migrate  包裹一下app和db(sqlalchemy对象)
Migrate(app, db)

# 第三步:把命令增加到flask-script中去
manager.add_command('db', MigrateCommand)  # 多出三个命令 init  migrate  upgrade
if __name__ == '__main__':
    manager.run()

总结

1.以后第一次执行一下
    	python manage.py db init  # 生成一个migrations文件夹,里面以后不要动,记录迁移的编号

2. 以后在models.py 写表,加字段,删字段,改参数
   	只需要执行
    	python manage.py db migrate  # 记录
       python manage.py db upgrade  # 真正的同步进去