之前我们一直在init文件中添加的库,设计的架构麻烦:
from flask import Flask
from flask_migrate import Migrate
from flask_session import Session
from App.models import db
def create_app():
app = Flask(__name__)
#session
app.config['SESSION_KEY'] = '110'
app.config['SESSION_TYPE'] = 'redis'
Session(app=app)
#SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:密码@地址:端口号/数据库名'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app=app)
#migrate
migrate = Migrate()
migrate.init_app(app=app, db=db)
return app
session、SQLAlchemy、migrate都隶属于第三方扩展库,所以我们可以新建一个名为ext的py文件来专门把第三方扩展库给加载过来。
在ext文件中:
from flask_migrate import Migrate
from flask_session import Session
from App.models import db
def init_ext(app):
app.config['SECRET_KEY'] = '110'
app.config['SESSION_TYPE'] = 'redis'
Session(app=app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:密码@地址:端口号/数据库名'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app=app)
migrate = Migrate()
migrate.init_app(app=app, db=db)
init文件:
from flask import Flask
from App.ext import init_ext
def create_app():
app = Flask(__name__)
init_ext(app)
return app
一般公司有四套数据库环境,每个数据库的数据,也不一样。
开发环境:程序员自己使用得环境,目的是为了完成功能
测试环境:高并发,高可用,数据量大,假数据,测试性能
演示环境:数据以及项目接近真实的线上环境,是逼真的线上环境
线上环境:真实的环境
新建一个名为settings文件来封装数据库
#每一个环境都需要返回一个连接的uri,这个uri是由7个参数拼接而来
#那么可以创建一个方法/函数,然后该方法专门用来拼接这个参数
# 这个方法的作用就是为了拼接这个uri
def get_database_uri(DATABASE):
dialect = DATABASE.get('dialect')
driver = DATABASE.get('driver')
user = DATABASE.get('user')
password = DATABASE.get('password')
host = DATABASE.get('host')
port = DATABASE.get('port')
database = DATABASE.get('database')
# dialect+driver://user:password@host:port/database
return '{}+{}://{}:{}@{}:{}/{}'.format(dialect, driver, user, password, host, port, database)
# 这四个类,都会给我们返回一个SQLALCHEMY_DATABASE_URI的值
# 但是在我们连接数据库的时候还需要SQLALCHEMY_TRACK_MODIFICATIONS
# 一般共享属性写在共享父类,然后继承
# 一般方法的业务逻辑,使用封装方法
class Config():
SQLALCHEMY_TRACK_MODIFICATIONS = False
#开发环境
class DevelopConfig(Config):
DATABASE = {
'dialect': 'mysql',
'driver': 'pymysql',
'user': 'root',
'password': 'xxxx',
'host': '127.0.0.1',
'port': '3306',
'database': 'flaskday08',
}
SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#测试环境
class TestConfig(Config):
DATABASE = {
'dialect': 'mysql',
'driver': 'pymysql',
'user': 'root',
'password': 'xxxx',
'host': '127.0.0.1',
'port': '3306',
'database': 'flaskday08',
}
SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#演示环境
class ShowConfig(Config):
DATABASE = {
'dialect': 'mysql',
'driver': 'pymysql',
'user': 'root',
'password': 'xxxx',
'host': '127.0.0.1',
'port': '3306',
'database': 'flaskday08',
}
SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#线上环境
class ProductConfig(Config):
DATABASE = {
'dialect': 'mysql',
'driver': 'pymysql',
'user': 'root',
'password': 'xxxx',
'host': '127.0.0.1',
'port': '3306',
'database': 'flaskday08',
}
SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#便于在init中获取类
ENV_NAME = {
'develop': DevelopConfig,
'test': TestConfig,
'show': ShowConfig,
'product': ProductConfig,
}
思考:settings怎么和init建立关联?同时不仅仅要和settings建立关联,还要将获取的2个属性:sqllalchemy_database_uri、 sqlalchemy_track_modifications
在init文件中:
from flask import Flask
from App import settings
from App.ext import init_ext
def create_app():
app = Flask(__name__)
# 想要settings和init建立关联,需要变成app.config的参数
# settings.ENV_NAME.get('delelop'):可以获取类
# from_object方法会获取的类的属性,配置到app的config参数中
app.config.from_object(settings.ENV_NAME.get('develop'))
init_ext(app)
return app
创建模型:
class Man(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(32))