Flask使用SQLAlchemy两种方式
一、SQLAlchemy和Alembic
主要使用原生的SQLAlchemy进行数据库操作和使用Alemic进行数据库版本控制
I 创建数据库主要有三个步骤
-
创建表的父类/数据库连接/Session
from sqlalchemy import Column, String, create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, sessionmaker BaseModel = declarative_base() engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test') DBSession = sessionmaker(bind=engine)
-
初始化每个表的class定义
class UserBaseModel(): __tablename__ = 'user_elabels' id = Column(Integer, privatemary_key=True) email = Column(String(25), index = True, nullable=False) md5_pwd = Column(String(128), nullable=False) @property def password(self): raise AttributeError('password cat not be read') @password.setter def password(self, pwd): m2 = hashlib.md5() m2.update(pwd) self.md5_pwd = m2.hexdigest() def verify_password(self, in_pwd): m2 = hashlib.md5() m2.update(in_pwd) return self.md5_pwd == m2.hexdigest()
-
创建表以及使用 sqlalchemy可以通过寻找BaseModel的所有子类完成表的创建
BaseModel.metadata.create_all(engine) # 创建session对象: session = DBSession() # 创建新User对象: new_user = User(...) # 添加到session: session.add(new_user) # 提交即保存到数据库: session.commit() # 关闭session: session.close()
参考资料:
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000
http://docs.sqlalchemy.org/en/latest/orm/tutorial.html
II 使用Alembic进行数据库版本管理
- pip install alembic
-
修改alembic.ini
改: sqlalchemy.url = ... 为 sqlalchemy.url = mysql://account:password@127.0.0.1/model_test
-
修改alembic/env.py
import sys from os.path import abspath, dirname sys.path.append(dirname(dirname(abspath(__file__)))) from models import BaseModel
target_metadata = BaseModel.metadata -
自动创建版本
alembic revision --autogenerate -m "initdb" ###这时候会在数据库中看到所有的表已经创建 #其他命令: #更新数据库: alembic upgrade 版本号 #更新到最新版: alembic upgrade head #降级: alembic downgrade 版本号 #降级到最初版本: alembic downgrade head
流程说明:
当我们第一次执行alembic revision --autogenerate -m "XXX"命令的时候,就会自动在数据库中创建表,此时alembic/versions/versionnumXXX.py中的upgrade()和downgrade()函数都为空。
数据库表模型发生变动时候,执行 alembic revision --autogenerate -m "XXX" 时候,就会在alembic/versions中自动生成一个versionnoXXX.py 的文件中的upgrade()函数和downgrade()自动生成迁移脚本,此时执行
``` alembic upgrade 版本号 或者 alemibc upgrade +1 ```
就会执行最新生成的versionnoXXX.py中的文件。 所以,也可以手工直接在alembic/versions下的文件中写Python代码执行升级,不过要注意版本号。
参考资料: http://alembic.zzzcomputing.com/en/latest/tutorial.html#the-migration-environment https://segmentfault.com/a/1190000006949536
二、使用Flask插件
主要基于flask-sqlalchemy, flask-migrate(封装了alembic), flask-script
from flask_sqlalchemy import SQLAlchemy from flask_script import Manager from flask_migrate import Migrate, MigrateCommand basedir = os.path.abspath(os.path.dirname(file)) app = Flask(name) app.config['SQLALCHEMYDATABASEURI'] = \ 'sqlite:///' + os.path.join(basedir, 'data.sqlite') app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True db = SQLAlchemy(app) manager = Manager(app) migrate = Migrate(app, db) manager.add_command('db', MigrateCommand)
其中flask-sqlalchemy封装了sqlalchemy,不用导入sqlalchemy的一些类和函数,比如在上面的例子中可以通过db.Column, db.relationship直接调用而不用再次导入
flask-alembic封装了alemibc,可以不用手工配置alembic.ini 和 alemibc/env.py 常用命令:
创建迁移仓库: python main.py db init 生成迁移脚本: python main.py db migrate -m "initial migration" 执行迁移脚本: python main.py db upgrade
参考资料: 基于python的web应用开发实战