【fly-iot飞凡物联】(11):将Postgres 数据库转换成 MySQL的数据库第一步,先转换SQL,然后再修改数据库链接,可以切换代码,还差部分初始化数据。

15587397:

前言


本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/130673631
fly-iot飞凡物联专栏:
https://blog.csdn.net/freewebsys/category_12219758.html

未经博主允许不得转载。
博主CSDN地址是:https://blog.csdn.net/freewebsys
博主掘金地址是:https://juejin.cn/user/585379920479288
博主知乎地址是:https://www.zhihu.com/people/freewebsystem

0,关于actorcloud项目


关于actorcloud项目,重新整理开源项目代码
原始项目: https://github.com/actorcloud/ActorCloud

项目都是采用 apache协议开源的。
之前的项目也是apache 协议开源的。

ActorCloud 是一个面向低功耗IoT网络,为企业提供一站式平台服务的物联网平台。ActorCloud 在安全可靠的基础上,为设备提供多种协议接入的通信能力,设备数据与消息流管理功能。

平台提供基础设备管理功能以连接、管理海量设备,实现设备的消息通信与数据采集持久化;集成规则引擎与数据可视化管理,灵活开放多种权限级别的管理、控制 API,通过 API 可快速开发上层应用,实现多端接入、设备远程控制。

IoT Hub:为终端上云建立可靠双向连接通道,进行认证鉴权、协议解析与消息路由;
设备管理:终端注册开通与生命周期管理,提供状态、故障、流量的不间断监控;
数据引擎:对获取的终端消息高速持久化、实时解析、规则事务处理与可视化展示;
应用使能:提供终端SDK、APP SDK,开放丰富的 REST API 接口,集成消息推送接口。

关于IOT项目地址:
项目地址:

前端项目地址:
https://gitee.com/fly-iot/fly-iot-frontend
后端项目地址:
https://gitee.com/fly-iot/fly-iot-backend-python
docker-compose 项目地址:
https://gitee.com/fly-iot/docker-compose

扫描二维码关注公众号,回复: 15587397 查看本文章

1,关于Postgres 数据库


数据库的性能确实非常好,但是感觉上没有太流行起来。
同时在云端的数据库有 TIDB可以支持 Mysql的驱动。扩展起来也很方便。
主要是Mysql用的人实在太多了。

PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES, 版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES 领先的许多概念在很久以后才出现在一些商业数据库系统中。

PostgreSQL是最初的伯克利代码的开源继承者。它支持大部分 SQL 标准并且提供了许多现代特性:

复杂查询
外键
触发器
可更新视图
事务完整性
多版本并发控制
同样,PostgreSQL可以用许多方法扩展,比如, 通过增加新的:

数据类型
函数
操作符
聚集函数
索引方法
过程语言
并且,因为自由宽松的许可证,任何人都可以以任何目的免费使用、修改和分发PostgreSQL, 不管是私用、商用还是学术研究目的。
http://www.postgres.cn/docs/14/intro-whatis.html

2,迁移方法


其实SQL 是标准的,但是每个数据库厂商实现的方式不太一样。
Postgres 有和 oracle 类似的通过 secquence 生成主键Id。
和一些特殊的字段吧。直接进行字符串替换就性了。

首先是 Postgres 数据库文件导出:

-- 只是将数据表结构和索引导出:
pg_dump -U actorcloud -l actorcloud > all.sql

去掉without time zone,
引号问题
去掉 character varying() 替换成 varchar()

timestamp , 修改成: timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

去掉 ::smallint,
修改 jsonb, 成 json,

然后类似将SQL 修改成:

Postgres SQL

CREATE TABLE public.actions (
    id integer NOT NULL,
    "createAt" timestamp without time zone,
    "updateAt" timestamp without time zone,
    "actionName" character varying(50),
    "actionType" smallint,
    description character varying(300),
    config jsonb,
    "userIntID" integer,
    "tenantID" character varying
);

修改成 MySQL :

CREATE TABLE actions (
    `id` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `createAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updateAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `actionName` varchar(50),
    `actionType` smallint,
    description varchar(300),
    config json,
    `userIntID` integer,
    `tenantID` varchar(200) 
);

可以看到 MySQL 的5.7 版本中还是有 json 方法的。

其他的SQL 参考:

docker-compose 项目地址:
https://gitee.com/fly-iot/docker-compose/blob/master/mysql-table-schema.sql

在这里插入图片描述
一共有 54 张表。

在这里插入图片描述

一共有54 张表:

`actions`, `actor_tasks`, `alembic_version`, `app_api_logs`, `app_api_logs_day`, `app_api_logs_hour`, `app_api_logs_month`, 

`applications`, `applications_groups`, `certs`, `certs_devices`, `codec`, `connect_logs`, `current_alerts`,

 `data_points`, `data_streams`, `device_count_day`, `device_count_hour`, `device_count_month`, `device_events`, 

`device_events_day`, `device_events_hour`, `device_events_latest`, `device_events_month`, `devices`, `dict_code`, `emqx_bills`, 

`emqx_bills_day`, `emqx_bills_hour`, `emqx_bills_month`, `end_devices`, `groups`, `groups_devices`, `history_alerts`, 

`invitations`, `login_logs`, `lwm2m_items`, `lwm2m_objects`, `messages`, `permissions`, `products`, `publish_logs`, `resources`, 

`roles`, `rules`, `rules_actions`, `services`, `streams_points`, `system_info`, `tenants`, `timer_publish`, `upload_info`,

 `users`, `users_groups`

3,数据库链接配置


import asyncpg

from actor_libs.database.async_db import db
from actor_libs.tasks.timer import App
from .api_count import api_count_task
from .config import project_config
from .device_count import device_count_task
from .device_events import device_events_aggr_task
from .emqx_bills import emqx_bills_aggr_task
from .timer_publish import timer_publish_task


__all__ = ['app']


app = App(node_id='timer_task')


@app.on_event('startup')
async def open_database_connection_poll():
    _pool = await asyncpg.create_pool(
        host=project_config.get('POSTGRES_HOST', 'localhost'),
        port=project_config.get('POSTGRES_PORT', 5432),
        user=project_config.get('POSTGRES_USER', 'actorcloud'),
        password=project_config.get('POSTGRES_PASSWORD', 'public'),
        database=project_config.get('POSTGRES_DATABASE', 'actorcloud'),
        min_size=5, max_size=10
    )
    await db.open(_pool)
    

可以看到使用了postgres数据库的连接池。驱动配置在yaml的配置中。

4,总结


需要做的事情还是挺多的呢。数据库的初始化。
同时配置 docker-compse 文件将数据库初始化了。

在这里插入图片描述

################## mysql 数据库 5.7 版本 ##################
  mysql-iot:
    restart: always
    image: mysql:5.7
    container_name: mysql-iot
    ports:
        - "3306:3306"
    volumes:
        - "./data/mysql/data:/var/lib/mysql"
        - "./mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf"
        - "./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql"
        - "./mysql/connDB.sh:/connDB.sh"
    environment:
        MYSQL_ROOT_PASSWORD: mysqliot
        MYSQL_DATABASE: fly_iot
        TZ: Asia/Shanghai
    command: [
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_general_ci',
        '--max_connections=3000'
    ]

只要配置 这个目录下的脚本就可也自动进行数据库初始化:
/docker-entrypoint-initdb.d/init.sql
然后就可以连接了,代码在配置中修改成mysql 链接。
同时增加 mysql 驱动:

apt install -y gcc  default-libmysqlclient-dev
pip3 install mysqlclient

然后可以注册/登陆成功,但是没有权限。

在这里插入图片描述

继续研究代码中。

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/130673631

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/freewebsys/article/details/130673631