Flask-migrate
和Flask-script
的时候,一般使用以下的目录结构: - myapp
--- app.py
--- config.py
--- exts.py
--- manage.py
--- models.py
以下对各个文件的作用进行解释:
config.py
:存放app
配置的,一般把数据库的配置放在这个里面,比如代码如下:
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'myapp'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
exts.py
:把db=SQLAlchemy()
这个变量放在这个文件中,而不是放在app
文件中。这样做的目的是为了在大型项目中如果db
被多个模型文件引用的话,会造成from your_app import db
这样的方式,但是往往也在your_app.py
中也会引入模型文件定义的类,这就造成了循环引用。所以最好的办法是把它放在不依赖其他模块的独立文件中。以后采用db.init_app(app)
的方式和app
进行绑定。
models.py
:这个文件存放所有的模型,并且通过from exts import db
的方式引用db
。并且需要注意,因为这里使用的是flask-script
的方式进行模型和表的映射,因此不需要使用db.create_all()
的方式创建数据库。
from exts import db
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(50))
def __init__(self,username):
self.username = username
manage.py
:这个文件用来存放映射数据库的命令,MigrateCommand
是flask-migrate
集成的一个命令,因此想要添加到脚本命令中,需要采用manager.add_command('db',MigrateCommand)
的方式,以后运行python manage.py db xxx
的命令,其实就是执行MigrateCommand
的命令。如果想要让flask-migrate
检测到模型,应该把models
模块导入到这个文件中。
from flask_migrate import Migrate,MigrateCommand
from ext import db
from flask_script import Manager
from flask import Flask
from constants import DB_URI
import models
# app = Flask(__name__)
# 这个 app 可以通过主 app 文件导入
# 也可以新建一个。建议使用导入的方式,
# 因为不需要额外的配置了。
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db.init_app(app)
migrate = Migrate(app,db)
manager = Manager(app)
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
1
loading 2017-03-14 12:38:57 +08:00 via Android
flask 网上已经有最佳实践。
|
2
KIDJourney 2017-03-14 15:31:42 +08:00
|