主要使用原生的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應用開發實戰