主要使用原生的SQLAlchemy进行数据库操做和使用Alemic进行数据库版本控制html
建立表的父类/数据库链接/Session python
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定义mysql
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的全部子类完成表的建立web
BaseModel.metadata.create_all(engine) # 建立session对象: session = DBSession() # 建立新User对象: new_user = User(...) # 添加到session: session.add(new_user) # 提交即保存到数据库: session.commit() # 关闭session: session.close()
参考资料:sql
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000数据库
http://docs.sqlalchemy.org/en/latest/orm/tutorial.htmlflask
修改alembic.inisegmentfault
改: sqlalchemy.url = ... 为 sqlalchemy.url = mysql://account:password@127.0.0.1/model_test
修改alembic/env.pysession
import sys from os.path import abspath, dirname sys.path.append(dirname(dirname(abspath(__file__)))) from models import BaseModel
target_metadata = BaseModel.metadata
自动建立版本app
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-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应用开发实战