Github 地址

项目背景


最近做个项目,需要进行试驾分析,所谓“试驾”,是指顾客在 4S 店指定人员的陪同下,沿着指定的路线驾驶车辆,从而了解这款汽车的行驶性能和操控性能。通常,无论是车厂(制造商),还是4S店(经销商),对车辆的试驾都比较感兴趣。从车厂的角度,不仅仅可以知道某辆车是否受欢迎,还可以监控4S店对车辆的使用的情况(车厂肯定不愿意原本是用来卖钱的车被私用)。

所以,试驾分析,是利用车载设备,比如 OBD、车机,或是其他能监控车辆的设备,我们采用 OBD,发送给软件平台一系列车辆实时状态消息,如GPS定位、百公里耗油、报警等,平台根据这些消息,以及4S店设置的电子围栏,进行试驾分析,包括试驾开始时间、试驾结束时间、试驾持续时间、行驶里程、油耗、平均速度、最大速度等。

迁移到:http://www.bdata-cap.com/newsinfo/841880.html

试驾分析算法,虽然有一定难度(核心算法1000多行),但跟测试这个算法相比,简直容易得不了。OBD 由另一个公司生产,他们只给了我们文档,来说明OBD消息二进制流的格式,由我们自己解析,再进行试驾分析。事实上,这个项目我的工作,要完成两个程序:消息解析服务和试驾分析服务,2个月完成,一共将近3.8万行代码,但前期没有任何测试手段,直到3个月后公司安排实车测试~

但问题来了,如果每次想测试软件和算法,都要用实车,这成本太高了,尤其是时间成本。程序员的时间很宝贵的。唯一的办法是,另写一个程序,能够模拟 OBD发送消息,相当于把之前实车的数据“回放”一遍。不仅如此,最好能自定义几个命令,来控制消息的发送以及电子围栏和相关时间的设置,比如,

  • “send”表示发送指定消息;
  • “wait”表示等待指定时间后再发送一下一个消息;
  • “set”表示设置电子围栏,或采集时间,或报备时间,即试驾分析只在采集时间内、报备时间外进行。
  • “echo”表示显示信息。

示例:

send 5830 

wait 1 

send 5841 

wait 1 

echo 将发送报警... 

send 5842 

…… 

事实也是这么做的。我用 Python 写了一个程序,并利用 nestordeharo/mysql-python-class 库访问 MySQL,可意外来了,时不时地程序会报错,MySQL 拒绝我的连接请求,有时一星期没事,有时完全无法使用。虽然我也知道,这个程序访问数据库太频繁,效率太低,但只是作为内部测试工具,没必要写的太好,而且一秒内访问两个数据库,MySQL 不至于这么弱吧,我是怀疑运维那边,数据库没配置好~但实在受不了了,严重影响测试进度,就弃用上面的库,自己写个简单的 Python 库,它只访问一次数据库。


功能简介

该 Python 库只访问一次 MySQL 数据库。

example 目录中是模拟 OBD 发送数据,简单来说,将历史数据回放一遍。

设计

自定义领域语言,包括 send、wait、set 和其子命令。定义基类和其 excute 方法,各个命令类都继承该基类,并实现该方法,

这样,若有集合,把所有命令放在其中,调用 excute 方法即可。


API

假设,有个表 t1,它有四个字段:id、name、age、loc。

* open(self)

打开数据库。

* close(self)

关闭数据库。

* select(self, table, where=None, args, *kwargs)

若查找ID为1的用户:

SELECT id,name FROM t1 WHERE id='1'

可以这样调用该方法:

select('t1', 'id = %s ', 'id', 'name', id='1')

* insert(self, table, args, *kwargs)

若想插入一条记录:

INSERT INTO t1(id, name, age, loc) VALUES(2,'person2', '20', '北京')

可以这样调用该方法:

insert('t1', id='2', name='person2', age='20')

* update(self, table, where=None, args, *kwargs)

若想更新一条记录:

UPDATE t1 SET name='p2' WHERE id='2'

可以这样调用该方法:

update('t1', 'id = %s ', '2', name='p2')

* delete(self, table, where=None, *args)

若想删除ID为2的记录:

DELETE FROM t1 where id='2'

可以这样调用该方法:

delete('t1', ' id = %s ', '2')

* select_advanced(self, sql, *args)

若想查找北京地区的成年人:

SELECT id,name,age FROM t1 WHERE age>18 and loc='北京'

可以这样调用该方法:

select_advanced('SELECT id,name FROM t1 WHERE age > %s AND loc = %s', ('age', '18'),('loc','北京'))

利用 Python 只连接一次 MySQL的更多相关文章

  1. 利用python将excel数据导入mySQL

    主要用到的库有xlrd和pymysql, 注意pymysql不支持python3 篇幅有限,只针对主要操作进行说明 连接数据库 首先pymysql需要连接数据库,我这里连接的是本地数据库(数据库叫ld ...

  2. 数据测试001:利用python连接数据库插入excel数据

    数据测试001:利用python连接数据库插入excel数据 最近在做数据测试,主要是做报表系统,需要往数据库插入数据验证服务逻辑,本次介绍如何利用python脚本插入Oracle和Mysql库中: ...

  3. 利用Python操作MySQL数据库

    前言 在工作中,我们需要经常对数据库进行操作,比如 Oracle.MySQL.SQL Sever 等,今天我们就学习如何利用Python来操作 MySQL 数据库. 本人环境:Python 3.7.0 ...

  4. Python远程连接MySQL数据库

    使用Python连接数据库首先需要安装Python的数据库驱动. 我的本地只装了Python,并没有装MySQL,当我使用命令: sudo pip install mysql-python 安装驱动( ...

  5. 通过python代码连接MySQL以及插入和显示数据

    通过python代码连接MySQL以及插入和显示数据: 数据库huahui创建一个shibie的表,里面有两个varcahr(100)的字段,num和result. import pymysql im ...

  6. 使用Python编程语言连接MySQL数据库代码

    使用Python编程语言连接MySQL数据库代码,跟大家分享一下: 前几天我用python操作了mysql的数据库,发现非常的有趣,而且python操作mysql的方法非常的简单和快速,所以我把代码分 ...

  7. Python Django连接(听明白了是连接不是创建!)Mysql已存在的数据库

    再声明一次!是连接不是创建!网上的一些人难道连接和创建这俩词都弄不懂就在那里瞎写一些文章! (Python Django连接存在的数据库) Python连接存在的数据库-------MySql 1.首 ...

  8. 利用python list 完成最简单的DB连接池

    先来看查看效果: 在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的连接下来,重启mysql命令: 关于python代码: # ...

  9. python MySQLdb连接mysql失败(转载)

    最近了解了一下django,数据库选用了mysql, 在连接数据库的过程中,遇到一点小问题,在这里记录一下,希望能够对遇到同样的问题的朋友有所帮助,少走一些弯路.关于django,想在这里也额外说一句 ...

随机推荐

  1. html5新特性之音频、视频

    1.视频 标签video video标签的属性 属性 描述 autoplay 视频就绪后自动播放 preload 视频在页面加载时加载 loop 视频播放完成后循环播放 controls 显示控件 s ...

  2. Web前台直接加载GIS格式数据分析

    本文以Flex直接加载Shp.DWG和MDB为例. 首先看一份现估测数据: 1)  加载Shp文件,目前直接由前台Flex代码完成: 图1 在ArcCatalog里面的Shp文件 图2 直接在前台加载 ...

  3. WinRAR安装、破解与去除弹窗广告

    本教程教大家怎么破解WinRAR压缩软件和去除广告(教程属于总结类,总结网上给出的方法,并且亲测有效,非本人原创)WinRAR5.40 2016.10.06 首先下载WinRAR软件,去它的官方英文网 ...

  4. CSDN 分糖果算法的思路和求助

    昨天晚上 在csdn上做了一道分糖果的题目,我自个测的是没有问题,但是提交答案后,老失败,提示 你的程序正常运行并输出了结果,但是答案错误你的程序输出结果与测试数据中的输出结果不符 我先把自个思路说一 ...

  5. 我总结的Android编程规范

    命名规则 1). 类名,接口名:以大写开头,如果一个类的类名由多个单词组成,所有单词的首字母必须大写,单词尽量写全称,不要简写,除非约定俗成的名字,例如:URL,RTMP,RTSP 这些广泛使用的专有 ...

  6. C#之玩转反射

    前言 之所以要写这篇关于C#反射的随笔,起因有两个:   第一个是自己开发的网站需要用到   其次就是没看到这方面比较好的文章. 所以下定决心自己写一篇,废话不多说开始进入正题. 前期准备 在VS20 ...

  7. CoreCLR on Mac:体验managed exception handling

    C#测试代码: using System; class Program { static void A() { try { Console.WriteLine("Throwing an ex ...

  8. Unity3D引用dll打包发布的问题及解决

    今年我们开始使用Unity3D开发MMORPG,脚本语言使用C#,这样我们就可以使用以往积累的许多类库.但是,在U3D中使用.NET dll的过程并不是那么顺利,比如我们今天遇到的这种问题. 一.问题 ...

  9. spring定时任务轮询(spring Task)

    定时任务轮询比如任务自服务器启动就开始运行,并且每隔5秒执行一次. 以下用spring注解配置定时任务.1.添加相应的schema xmlns:task=" xsi:schemaLocati ...

  10. atittit.表单验证的实现方式以及原理本质以及选型以及自定义兼容easyui dsl规则的表单验证

    atittit.表单验证的实现方式以及原理本质以及选型以及自定义兼容easyui dsl规则的表单验证 1. 需求,表单验证需要弹框式,但目前easyui ms绑定死了tooltip式样 1 2. 表 ...