如何在已有的Flask项目添加数据表结构?

接盘侠

问题场景:
已有的flask项目:flask+sqlalchemy+uwisg+mysql
如何在已有的Flask项目添加数据表结构?

思路:
1、在新增的create_table.py中引入新的db对象,创建数据表模型类,并创建函数create_tbl()来执行db.create_all()生成表结构
2、在_init_.py中创建蓝图,并执行db.create_all()
3、在view.py(之前已经导入了db)中用到新建表的函数内部导入create_table.py中新创建的db对象进行数据库操作,否则会由于数据库db错乱导致程序运行失败

create_table.py

import logging
from configparser import ConfigParser
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime, timedelta

app = Flask(__name__)


class Config:
    BOOTSTRAP_SERVE_LOCAL = True
    SECRET_KEY = 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    MAIL_SERVER = 'mail.unionpay.com'
    MAIL_USERNAME = 'cupspapp'
    MAIL_PASSWORD = 'cupspapp@123456'
    REMEMBER_COOKIE_DURATION = timedelta(days=30)
    UPLOAD_FOLDER = '/home/wwsmgm/Flask/WWSMGM-z/app/static/files'
    ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif','csv'])

    @classmethod
    def init_app(cls, app):
        pass


# 开发下的配置环境
class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://name:pwd@ip/databasename'


class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://name:pwd@ip/databasename'
    @classmethod
    def init_app(cls, app):
        if not app.debug:
            import logging
            from logging.handlers import RotatingFileHandler
            formatter = logging.Formatter('%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s  %(message)s', '%Y-%m-%d %H:%M:%S')
            file_handler = RotatingFileHandler('log/WWSMGM.log', 'a', 20*1024*1024, 3)
            file_handler.setLevel(logging.DEBUG)
            file_handler.setFormatter(formatter)
            app.logger.addHandler(file_handler)


# config字典可用于选择不同的配置环境,程序中默认是default
config = {
    'production': ProductionConfig,
    'development': DevelopmentConfig,
    'default': DevelopmentConfig
}

# 设置参数
app.config.from_object(config['default'])

'''创建数据库 sqlalchemy 工具对象'''
db = SQLAlchemy(app)

"""
    创建数据库模型类(继承 sqlalchemy 工具对象中的Model类),一个模型类对应一张模型表
    数据库表名的常见规范:
        (1) 数据库名缩写_表名   (2) tbl_表名
"""


class Tbl_next_week_change_state(db.Model):
    __tablename__ = 'tbl_next_week_change_state'
    id = db.Column(db.Integer, primary_key=True)
    taskName = db.Column(db.String(100))
    taskState = db.Column(db.String(32))
    system = db.Column(db.Boolean, default=0)  # 0指生产 1是认证
    createTime = db.Column(db.DateTime, default=datetime.now)
    updateTime = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)


def create_tbl():
    try:
        db.create_all()
    except Exception as e:
        logging.error(str(e) + '----' +  str(__file__))


if __name__ == '__main__':
    '''创建表'''
    db.create_all()

init.py

#!/usr/bin/env python3
# -*- coding=UTF-8 -*-
from flask import Blueprint
from .create_table import create_tbl
next_week_plan = Blueprint('next_week_plan', __name__)

from . import views

create_tbl()  #执行  生成表结构

view.py

from app import db   # 原本的引入

# 登录uosp   Tbl_next_week_change_state
@next_week_plan.route('/wws_change', methods=['GET', 'POST'])
def get_wwsmgm_change_data_fun():
    from app.tools.next_change_data import check_state_fun
    from .create_table import db  # 新的引入
    json_data = request.get_json()
    username = json_data.get('username')
    password = json_data.get('password')
    institute = json_data.get('institute')
    taskname_list = get_taskname_data()  # 获取任务名{'sc_data':['TD', '', 'taskname'],[]}
    try:
        state_list = check_state_fun(username, password, institute, taskname_list)   # [{'name':'state', 'name':'state', 'name':'state' ...}, {}]    global glo_data_list
    except Exception as e:
        print(e)
        print('数据库更新失败1')
    try:
        if state_list != [{}, {}]:
            for task_name, task_state in state_list[0].items():
                result = Tbl_next_week_change_state.query.filter(and_(Tbl_next_week_change_state.taskName == task_name, Tbl_next_week_change_state.system == 0)).first()
                print(result)
                if result is None:
                    add_next_week_change_state = Tbl_next_week_change_state(taskName=task_name, taskState=task_state, system=0)
                    db.session.add(add_next_week_change_state)
                    try:
                        db.session.commit()
                    except Exception as e:
                        print(e)
                        db.session.rollback()
                elif result.taskState != task_state:
                    try:
                        result.taskState = task_state
                    except Exception as e:
                        print(e)
                    try:
                        db.session.commit()
                    except Exception as e:
                        print(e)
                        db.session.rollback()
                else:
                    pass

            for task_name, task_state in state_list[1].items():
                result = Tbl_next_week_change_state.query.filter(
                    and_(Tbl_next_week_change_state.taskName == task_name, Tbl_next_week_change_state.system == 1)).first()

                if result is None:
                    add_next_week_change_state = Tbl_next_week_change_state(taskName=task_name, taskState=task_state, system=1)
                    db.session.add(add_next_week_change_state)
                    try:
                        db.session.commit()
                    except Exception as e:
                        print(e)
                        db.session.rollback()
                elif result.taskState != task_state:
                    try:
                        result.taskState = task_state
                    except Exception as e:
                        print(e)
                    try:
                        db.session.commit()
                    except Exception as e:
                        print(e)
                        db.session.rollback()
                else:
                    pass
        else:
            pass
    except Exception as e:
        print(e)
        print('数据库更新失败2')
    return repr(state_list)

猜你喜欢

转载自www.cnblogs.com/We612/p/11498927.html