上一章主要讲了peewee的概念以及如何安装peewee和对现有的数据库结构创建peewee使用的数据模型代码.

在上一章的基础上,完成了数据模型代码以及通过peewee连接数据库了以后,如何对数据库中的记录进行增删查改操作.

下面的讲解与示例代码都将使用以下数据模型:

class DeviceStatus(Model):
    id = AutoField(column_name='Id')
    event_notify_phone_number = IntegerField(null=True)
    firmware_version = CharField(constraints=[SQL("DEFAULT ''")], null=True)
    heartbeat_time = DateTimeField(null=True)
    mac = CharField(null=True)
    normal_pressure_calibration = IntegerField()
    zero_pressure_calibration = IntegerField()
    normal_thermocouple0_calibration = IntegerField()
    zero_thermocouple0_calibration = IntegerField()
    normal_thermocouple1_calibration = IntegerField()
    zero_thermocouple1_calibration = IntegerField()
    update_time = DateTimeField(null=True)
    event = TextField(null=True)
    valve_state = TextField(null=True)
    wifi_rssi = IntegerField(constraints=[SQL("DEFAULT -1")], null=True)
    wifi_ssid = CharField(constraints=[SQL("DEFAULT ''")], null=True)

    class Meta:
        table_name = 'device_status'
  • 增加记录

我这边比较喜欢用get_or_create()的方式,因为这是数据模型实际上是描述一个设备的信息,我这边基本上不会单独在某个时间点去创建一个条目,而是等设备上传自身信息时去更新现有条目或者这个时候创建并更新条目.

比如说以下例子:

# 更新阀门的状态信息
def update_valve_state(mac, valve_state=""):
    try:
        p, created = DeviceStatus.get_or_create(mac=mac)
        p.valve_state = valve_state
        p.save()
        return True

    except Exception as e:
        # 发生错误
        print("update_valve_state 发生错误")
        pprint.pprint(e)

    return False

这个函数的功能就是先通过mac字段找到对应的条目(如果没找到就创建一个mac字段等于我提供的值的条目).然后将该条目的valve_state字段值修改成我指定的值.所以这个函数不单是"增"还包括了"改",或者说本质上是"改",但是如果没有找到条目就顺便"增"了再"改".

  • 删除记录

# 清除设备信息
def remove_dev_info(mac):
    try:
        DeviceStatus.delete().where(DeviceStatus.mac == mac).execute()
        return True
    except Exception as e:
        # 发生错误
        print("remove_dev_info 发生错误")
        pprint.pprint(e)
    return False

这个函数的功能是先通过查询mac字段,找到mac字段与我提供的值相匹配的条目,然后删除.

  • 查找记录
# 获取设备所绑定的用户ID
def get_bind_account_id(mac):
    try:
        p = DeviceStatus.get_or_none(mac=mac)
        if p is not None:
            return p.account_id
        return None
    except Exception as e:
        # 发生错误
        print("get_bind_account_id 发生错误")
        pprint.pprint(e)
    return None

这个函数的功能是先通过查询mac字段,尝试找到与我提供的值相匹配的条目,如果找到了,返回该条目对应的对象,如果没找到,返回None.如果返回了有效的条目对象,我这边就直接获取对象的"account_id"属性的值,以达到根据mac去查对应的account_id的功能.


一个电子工程师的自我修养