保存数据到 PostgreSQL

搭建 PostgreSQL 数据库,以 MacOS X 为例:

  1. $ brew install postgresql
  2. $ brew services start postgresql
  1. ## 使用用户名 root 创建名为 'mqtt' 的数据库
  2. $ createdb -U root mqtt
  3. $ psql -U root mqtt
  4. mqtt=> \dn;
  5. List of schemas
  6. Name | Owner
  7. --------+-------
  8. public | shawn
  9. (1 row)

初始化 PgSQL 表:

  1. $ psql -U root mqtt

创建 t_mqtt_msg 表:

  1. CREATE TABLE t_mqtt_msg (
  2. id SERIAL primary key,
  3. msgid character varying(64),
  4. sender character varying(64),
  5. topic character varying(255),
  6. qos integer,
  7. retain integer,
  8. payload text,
  9. arrived timestamp without time zone
  10. );

创建规则:

打开 emqx dashboard,选择左侧的 “规则” 选项卡。

选择触发事件 “消息发布”,然后填写规则 SQL:

  1. SELECT * FROM "#"

image

关联动作:

在 “响应动作” 界面选择 “添加”,然后在 “动作” 下拉框里选择 “保存数据到 PostgreSQL”。

image

填写动作参数:

“保存数据到 PostgreSQL” 动作需要两个参数:

1). SQL 模板。这个例子里我们向 PostgreSQL 插入一条数据,SQL 模板为:

  1. insert into t_mqtt_msg(msgid, topic, qos, retain, payload, arrived) values (${id}, ${topic}, ${qos}, ${retain}, ${payload}, to_timestamp(${timestamp}::double precision /1000)) returning id

插入数据之前,SQL 模板里的 ${key} 占位符会被替换为相应的值。

image

2). 关联资源的 ID。现在资源下拉框为空,可以点击右上角的 “新建资源” 来创建一个 PostgreSQL 资源:

image

选择 “PostgreSQL 资源”。

填写资源配置:

数据库名填写 “mqtt”,用户名填写 “root”,其他配置保持默认值,然后点击 “测试连接” 按钮,确保连接测试成功。

最后点击 “新建” 按钮。

image

返回响应动作界面,点击 “确认”。

image

返回规则创建界面,点击 “新建”。

image

规则已经创建完成,现在发一条数据:

  1. Topic: "t/1"
  2. QoS: 0
  3. Retained: false
  4. Payload: "hello1"

然后检查 PostgreSQL 表,新的 record 是否添加成功:

image

在规则列表里,可以看到刚才创建的规则的命中次数已经增加了 1:

image