基于SQLite的发动机数据库搭建
文章目录
- 发动机实体及其属性
- 发动机数据库表格的存储格式
- 发动机数据库表
- 气缸
- 发动机
- 缸压
- 阀门
- 关键字的对应
- 发动机数据库的操作
- 数据库的插入操作:
发动机数据量非常之多,需要专门的数据库管理系统来帮助管理其数据,本文以面向对象的思想建立发动机数据库的关系模型,使用SQLite来建立其数据库,SQLite的参考资料 1。
发动机数据库的特点:
- 数据缺失:发动机的数据经常有缺失的现象,所以发动机的每一个数据都可以为空数据。
发动机实体及其属性
柴油机由五大系统两大机构组成,分别为进气系统、燃料供给系统、起动系统、冷却系统、润滑系统、点火系统,两大机构分别为配气机构、曲柄连杆机构。不同的机构又是由许多部件实体组成的,如配气机构由凸轮轴、气门等等组成,关系数据库就是要建立各个实体之间的联系和实体属性集。
一个标准的柴油机主要包括以下实体,气缸、曲轴、进排气阀、进排气管、涡轮增压器、三通管等等。

发动机数据库表格的存储格式
使用关系数据库来组织数据时,其关系模型表示为:
关系名(属性1,属性2,…,属性n)
我们在设计数据库时将物理量的单位也当作属性名的一部分,这样能够避免属性单位的混乱,只是在数据表的读取和写入时带来麻烦,以“属性(单位)”的形式命名属性名,在读取时用python的正则表达式来解析属性及其单位,使用re库中的search方法能够该功能2。
re.search(r'\(.*\)$',"connecting rod length(mm)").group(0)[1:-1]
就能返回单位"mm",用表达式:
re.search(r'^.*\(',"connecting rod length(mm)").group(0)[:-1]
就能返回属性"connecting rod length"。
下面的函数搜索字符串中的属性和单位:
def searchNameAndUnitSqure(string):matchName=re.search(r'^.*\(',string)if matchName:name=re.search(r'^.*\(',string).group(0)[:-1]else:name=string.strip()matchUnit=re.search(r'\(.*\)$',string)if matchUnit:unit=re.search(r'\(.*\)$',string).group(0)[1:-1]else:unit="/"return name,unit
如果是用分隔符分割属性和单位名字,则需要稍作变化:
def searchNameAndUnitDeli(string,deli=","):matchName=re.search(r'^.*'+deli,string)if matchName:name=re.search(r'^.*'+deli,string).group(0)[:-1]else:name=string.strip()matchUnit=re.search(deli+r'.*$',string)if matchUnit:unit=re.search(deli+r'.*$',string).group(0)[1:]else:unit="/"return name,unit
发动机数据库表
气缸
| 属性 | 英文 | 单位 | 数据类型 | 范围 |
|---|---|---|---|---|
| 发动机型号 | Engine type | / | VARVHAR | |
| 缸径 | Bore | m m mm mm | FLOAT | 柴油机在全负荷时 高速机 ϕ a = 1.2 − 1.5 \phi_a=1.2-1.5 ϕa=1.2−1.5 |
| 冲程 | Stroke | m m mm mm | FLOAT | |
| 连杆长度 | connecting rod length | m m mm mm | FLAOT | |
| 压缩比 | Compression ratio | / | FLOAT | |
| 气缸数 | Number of cylinders | / | FLAOT |
DROP TABLE IF EXISTS CylinderGeometry;
CREATE TABLE CylinderGeometry(`idCylinderGeometry` INTEGER PRIMARY KEY AUTOINCREMENT,`Engine type` VARCHAR(45) UNIQUE,`Bore(mm)` REAL,`Stroke(mm)` REAL,`Compression ratio(/)` REAL,`Connecting rod length(mm)`REAL,`Number of cylinders(/)` INTEGER DEFAULT 1
);
发动机
发动机的基本信息包括
| 属性 | 英文 | 单位 | 数据类型 | 范围 |
|---|---|---|---|---|
| 发动机型号 | Engine type | / | VARCAHR | |
| 生产公司 | Production company | / | VARCAHR | |
| 用途 | Engine usage | / | VARCAHR | |
| 应用年代 | Using era | / | VARCHAR | |
| 冲程数 | Stroke number | / | INTEGER | |
| 气缸排列方式 | Cylinder arrangement | / | VARCHAR | |
| 气缸数 | Number of cylinders | / | INT | |
| 发火顺序 | Firing order | / | VARCAHR | |
| 发动机排量 | Displacement volume | L L L | FLAOT | |
| 标定转速 | Rated speed | r / m i n r/min r/min | FLOAT | |
| 标定功率 | Rated power | k W kW kW | FLOAT | |
| 平均有效压力 | Brake mean effective pressure(BMEP) | b a r bar bar | FLOAT | |
| 燃油消耗率 | Brake spacific fuel consumption(BSFC) | g / ( k W ⋅ h ) g/(kW\cdot h) g/(kW⋅h) | FLOAT |
DROP TABLE IF EXISTS EngineBasicPara;
CREATE TABLE EngineBasicPara(`idengine` INTEGER PRIMARY KEY AUTOINCREMENT,`Engine type` VARCHAR(45) UNIQUE,`Production company` VARCHAR(45),`Engine usage` VARCHAR(45),`Using era` VARCHAR(45),`Stroke number` INTEGER,`Number of cylinders` INTEGER,`Cylinder arrangement` VARCHAR(45),`Firing order` VARCAHR(45),`displacement volume(L)` REAL,`Rated speed(/)` REAL,`Rated power(kW)` REAL,`BMEP(bar)` REAL,`BSFC(g/(kW*h))` REAL
);
其中如果该发动机关联了CylinderGeometry的话则有些参数如displacment volume就唯一决定于气缸几何参数
缸压
在储存缸压数据时要创建一个表格,表格的名称必须要唯一,“idEngine+CylinderPressure+Speed+power”的形式,如Engine 1 cylinder pressure at speed 2000rpm power 45kW的形式
DROP TABLE IF EXISTS `Engine 1 cylinder pressure at speed 2000rpm power 45kW`;
CREATE TABLE `Engine 1 cylinder pressure at speed 2000rpm power 45kW`(`crank angle(CA)` REAL PRIMARY KEY NOT NULL,`cylinder pressure(Pa)` REAL NOT NULL
);
阀门
| 属性 | 英文 | 单位 | 数据类型 | 范围 |
|---|---|---|---|---|
| 气阀直径 | Valve diameter | m m mm mm | FLOAT | |
| 气阀数量 | Number of valves per cylinder | / | INTEGER |
关键字的对应
建立发动机英文和中文的键值对,以Json文件的格式存储:
{"Engine type":["发动机型号"],"Bore":["缸径"],"Stroke":["冲程"],"Connecting rod length":["连杆长度"],"Compression ratio":["压缩比"],"Number of cylinders":["气缸数"],"Production company":["生产公司"],"Engine usage":["用途"],"Using era":["应用年代"],"Stroke number":["冲程数"],"Cylinder arrangement":["气缸排列方式"],"Firing order":["发火顺序"],"Displacement volume":["发动机排量"],"Rated speed":["标定转速"],"Rated power":["标定功率"],"BMEP":["平均有效压力"],"BSFC":["燃油消耗率"]
}
定义一个translate方法将所有的表格中的存在的关键字别名翻译成标准关键字存入到数据库中3:
def translate(self,jsonfile="NameDic.json"):def getKey(dic, value):if value not in dic.values():return Noneelse:for i in dic.keys():if dic[i] == value: return idef getKey2(dic, value):for each in dic.values():if value in each:return getKey(dic, each)else:return Noneimport jsonwith open(jsonfile, 'r+', encoding='utf-8') as f:content = json.load(f)for i in range(self.col):key=getKey2(content,self.table[i].ColName)if key is not None:self.table[i].ColName=key
发动机数据库的操作
数据库的插入操作:
在得到新的数据之后,需要将数据先读入到内存中,然后插入到相应的表格中,插入前首先要检查该表格中有没有该机型的数据,如果有,则补充缺失的数据,如果没有则添加一条数据。
未完待续。。。
sqlite-tutorial ↩︎
(中国)东郭大猫.Scrapy网络爬虫实战[M].北京:清华大学出版社.2019. ↩︎
python中json的操作 ↩︎
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
