基于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 mmFLOAT柴油机在全负荷时
高速机 ϕ a = 1.2 − 1.5 \phi_a=1.2-1.5 ϕa=1.21.5
冲程Stroke m m mm mmFLOAT
连杆长度connecting rod length m m mm mmFLAOT
压缩比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 LFLAOT
标定转速Rated speed r / m i n r/min r/minFLOAT
标定功率Rated power k W kW kWFLOAT
平均有效压力Brake mean effective pressure(BMEP) b a r bar barFLOAT
燃油消耗率Brake spacific fuel consumption(BSFC) g / ( k W ⋅ h ) g/(kW\cdot h) g/(kWh)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 mmFLOAT
气阀数量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 None
            else:
                for i in dic.keys():
                    if dic[i] == value: return i

        def getKey2(dic, value):
            for each in dic.values():
                if value in each:
                    return getKey(dic, each)
            else:
                return None

        import json
        with 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

发动机数据库的操作

数据库的插入操作:

在得到新的数据之后,需要将数据先读入到内存中,然后插入到相应的表格中,插入前首先要检查该表格中有没有该机型的数据,如果有,则补充缺失的数据,如果没有则添加一条数据。

未完待续。。。


  1. sqlite-tutorial ↩︎

  2. (中国)东郭大猫.Scrapy网络爬虫实战[M].北京:清华大学出版社.2019. ↩︎

  3. python中json的操作 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值