接盘侠
问题场景:
已有的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)