flask-sqlalchemy,flask-migrate
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 # 真正的同步进去