一个基于flask的实时更新数据库项目

引言

在做导师项目的过程中,需要一个实时更新的数据库,用于完成实时仿真实验。然而工厂那边的数据库突然不好使了,而且就算好使的话本人涉及到的工业项目一般也是半夜凌晨开工,就算好使也不能凌晨在实验室做项目啊。。。一怒之下,还是自己模拟一个实时更新的数据库吧。

前期工作

本人最近一直在用flask做项目,刚好学习到用SQLAlchemy操作数据库,那就正好趁热打铁,直接拿flask做一个每隔一段时间往数据库里插入数据的项目吧。

  1. 项目环境:Pycharm + Python 3.5 +flask v1.0.2 + mariadb(mysql也行)+Navicat(数据库可视化,方便操作数据库)+ csv格式的数据文件

其中,csv文件共6列,从左到右分别是current_A,current_B,current_C,action_A,action_B,action_C,共3601行(由于工业数据是保密的,不能外漏哈),csv文件的作用是将里面的数据一条条的插入到数据库中,模拟实际工业实时生产过程。

  1. 在Navicat中新建一个database,名为real_time_db,我的数据库用户名是root,密码是123456,本地ip就是127.0.0.1,于是,配置数据库的语句为:
# 配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]/real_time_db'
# 跟踪数据库的修改,默认填False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

需要注意,这地方需要导入pymysql第三方库。

  1. 在Navicat中导入表结构,表名为fur_data:
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for fur_data
-- ----------------------------
DROP TABLE IF EXISTS `fur_data`;
CREATE TABLE `fur_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `current_A` float DEFAULT NULL,
  `current_B` float DEFAULT NULL,
  `current_C` float DEFAULT NULL,
  `action_A` float DEFAULT NULL,
  `action_B` float DEFAULT NULL,
  `action_C` float DEFAULT NULL,
  `d_time` datetime DEFAULT NULL COMMENT '数据采集时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2906 DEFAULT CHARSET=latin1;

想插入一条数据,语句为:

-- 非真实数据
INSERT INTO `fur_data` VALUES ('1', '20000.0', '20000.0', '20000.0', '0.0', '0.0', '0.0', '2019-6-16 00:00:00');

完整代码

全部代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import time
import csv
import pymysql
pymysql.install_as_MySQLdb()

app = Flask(__name__)

# 配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]/real_time_db'
# 跟踪数据库的修改,默认填False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# 建立一个关于表的类
class Fur(db.Model):
    __tablename__ = 'fur_data'# 定义表名

    id = db.Column(db.Integer, primary_key=True)
    current_A = db.Column(db.Float, nullable=False)
    current_B = db.Column(db.Float, nullable=False)
    current_C = db.Column(db.Float, nullable=False)
    action_A = db.Column(db.Float, nullable=False)
    action_B = db.Column(db.Float, nullable=False)
    action_C = db.Column(db.Float, nullable=False)
    d_time = db.Column(db.DateTime, nullable=False)

# 先删除,再创建
# 删除表
 db.drop_all()
# 创建表
 db.create_all()

reader = csv.reader(open('FMF_data.csv'))
# A,B,C电流和频率的list初始化
current_A_list = []
current_B_list = []
current_C_list = []
action_A_list = []
action_B_list = []
action_C_list = []

for list in reader:
    current_A_list.append(list[0])
    current_B_list.append(list[1])
    current_C_list.append(list[2])
    action_A_list.append(list[3])
    action_B_list.append(list[4])
    action_C_list.append(list[5])

len = len(current_A_list)
i = 0

# 每隔一秒插入一个数据
while True:
    time.sleep(1)
    current_A = current_A_list[i]
    current_B = current_B_list[i]
    current_C = current_C_list[i]
    action_A = action_A_list[i]
    action_B = action_B_list[i]
    action_C = action_C_list[i]
    d_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

    fur = Fur(current_A=current_A, current_B=current_B, current_C=current_C, action_A=action_A, action_B=action_B, action_C=action_C, d_time=d_time)
    db.session.add(fur)
    db.session.commit()
    print("插入成功!")
    i += 1
    if i == 3600: #所有数据都插完了就从头再插一遍
        i = 0


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

运行过程中,当下方交互式命令行显示“插入成功!”,说明程序正常运行了,点开数据库,刷新一下,看看是否是实时更新的数据库。

最后

需要注意的是,在导入第三方库的过程中,

from flask_sqlalchemy import SQLAlchemy

这句话需要导入两个包:Flask-SQLAlchemy和SQLAlchemy,只导入一个的话编程过程中不会有错误提示,但是运行时就悲剧了。另外再报错的话看看数据库的配置改没改,端口是否被占用,python编辑器(interpreter)是否更改等问题。
关于时间戳的问题,详见我的另一篇博客:https://blog.csdn.net/xiecheng1995/article/details/90900496

本人原创。转载请标明出处,谢谢!

你可能感兴趣的:(python)