最近在学习《flaskweb开发》,教程里采用 sqlite 数据库,我自己用的是mysql,在到数据库迁移部分有点懵了,想跳过去,但是到后面发现很不方便,于是折腾了好长时间,网上也找不到现成的教程,于是想着自己搞一下试试,终于大功告成!
1.框架
flask_migrate
flask_sqlalchemy
2.然后是一些配置
/config.py
class Config(object):
CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:root@localhost/test'
config = {
'development': DevelopmentConfig,
'default': DevelopmentConfig
}
/manager.py
from app import create_app,db
from app.models import User #注册数据库模型
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand #载入migrate扩展
app = create_app( 'default')
manager = Manager(app)
migrate = Migrate(app, db) #注册migrate到flask
manager.add_command('db', MigrateCommand) #在终端环境下添加一个db命令
if __name__ == '__main__':
manager.run()
/app/init.py
from flask import Flask
from config import config
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_name):
""" 使用工厂函数初始化程序实例"""
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app=app)
# db.init_app(app=app)
return app
/app/models.py
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
nickname = db.Column(db.String(64), index = True, unique = True)
email = db.Column(db.String(120), index = True, unique = True)
def __repr__(self):
return '<User %r>' % (self.nickname)
3.完成之后,开始初始化
(web) E:\python\flaskblog>python manage.py db init
在虚拟环境(我的是(web))中进行初始化,根目录下出现migrations文件夹,里面有自动生成的一下文件,脚本等
4.更新models.py
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
def __repr__(self):
return '<User %r>' % (self.nickname)
class Post(db.Model):
id = db.Column(db.Integer, primary_key = True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self):
return '<Post %r>' % (self.body)
5.继续执行迁移命令
python manage.py db migrate -m “first init db”
python manage.py db upgrade
连接mysql可以发现迁移成功了!
6.继续学习
文件结构