在做导师项目的过程中,需要一个实时更新的数据库,用于完成实时仿真实验。然而工厂那边的数据库突然不好使了,而且就算好使的话本人涉及到的工业项目一般也是半夜凌晨开工,就算好使也不能凌晨在实验室做项目啊。。。一怒之下,还是自己模拟一个实时更新的数据库吧。
本人最近一直在用flask做项目,刚好学习到用SQLAlchemy操作数据库,那就正好趁热打铁,直接拿flask做一个每隔一段时间往数据库里插入数据的项目吧。
其中,csv文件共6列,从左到右分别是current_A,current_B,current_C,action_A,action_B,action_C,共3601行(由于工业数据是保密的,不能外漏哈),csv文件的作用是将里面的数据一条条的插入到数据库中,模拟实际工业实时生产过程。
# 配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]/real_time_db'
# 跟踪数据库的修改,默认填False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
需要注意,这地方需要导入pymysql第三方库。
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
本人原创。转载请标明出处,谢谢!