MySql开发之自动同步表结构

MySql开发之自动同步表结构攻略

在 MySQL 开发项目中,表结构同步通常是一个很耗时的任务,特别是在团队协作开发的情况下。你必须确保所有的开发人员和数据库管理人员都知道这个改动。但是,手工同步表结构的过程往往容易出错,因此我们需要一种自动化的方法。下面就介绍一些方法可以自动同步表结构。

使用 "Flyway" 自动同步表结构

"Flyway" 是一种开源工具,它可以帮助我们自动化地控制数据库 schema 的版本管理。当数据 schema 发生变化时,它可以在原有 schema 的基础上自动升级 schema 并且修改相关的数据。"Flyway" 主要的功能是:

  • 自动执行数据库脚本;
  • 控制脚本的顺序和执行顺序;
  • 非常容易和市场上其他工具集成。

安装和配置

"Flyway" 支持多种语言和数据库,具体的安装和配置方式可以参考 Flyway官方文档

下面是一个基本的示例 Docker Compose 文件,它使用 "Flyway" 来管理 MariaDB 的数据库 schema 版本。如果你对 "Flyway" 不熟悉,这是一个可以帮助你快速入门的例子。

version: '3'
services:
  flyway:
    image: boxfuse/flyway:7.7.2
    volumes:
      - ${PWD}/migrations:/flyway/sql
    environment:
      - FLYWAY_URL=jdbc:mariadb://mariadb:3306/flyway
      - FLYWAY_USER=root
      - FLYWAY_PASSWORD=root
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:10.5
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - '3306:3306'

上述 Docker Compose 文件中,使用的 "boxfuse/flyway" 镜像包含了基本的 "Flyway" 客户端工具。我们把 MariaDB 作为后端数据存储,它会被 "Flyway" 使用。

migrations/ 目录中,我们可以放置 SQL 脚本,"Flyway" 将会在启动时自动执行这些脚本,并记录每一个版本号。

使用 Flyway 进行自动同步

下面我们就来演示 "Flyway" 的自动同步表结构功能。首先,我们在 migrations/ 目录中创建一个 SQL 脚本文件 V1__users.sql,它包含了 Users 数据表的创建 SQL 命令。

CREATE TABLE `Users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

然后,我们将这个 SQL 脚本文件添加到我们的代码版本控制工具中。

接下来,我们将 "Flyway" 服务启动起来,并检查 "Flyway" 是否自动执行了 SQL 脚本并创建了 Users 数据表。

docker-compose up -d

当服务启动完成后,我们可以使用以下命令查看 "Flyway" 是否成功创建了 Users 数据表。

docker-compose exec mariadb mysql -proot -e "use flyway; show tables;"

这将输出一个结果,含有 "Users" 表名。

下面我们演示另一个场景,我们新建了一个 SQL 脚本文件 V2__alter_users_table.sql,它用于修改 Users 数据表的结构。如下是 SQL 命令:

ALTER TABLE `Users` ADD COLUMN `email` varchar(100) NOT NULL AFTER `username`;

我们将这个 SQL 脚本文件加入到 migrations/ 目录,并再次使用 docker-compose up -d 命令重启 "Flyway" 服务。"Flyway" 会自动检测到新的 SQL 脚本文件,并执行它来修改我们的 "Users" 数据表。

这时候我们再次使用 docker-compose exec mariadb mysql -proot -e "use flyway; describe Users;" 查询表结构,将会看到一个新添加的 email 字段。

使用 "Liquibase" 自动同步表结构

"Liquibase" 是另一个开源的数据库 schema 版本管理工具,它支持多种数据库,并提供了非常强大的自动化 schema 升级和同步功能。与 "Flyway" 不同的是,"Liquibase" 不仅支持 SQL 脚本,还支持多种 XML 和 YAML 等格式的脚本定义,并且更加灵活。

安装和配置

"Liquibase" 也支持多种语言和数据库,具体的安装和配置方式可以参考 Liquibase官方文档

下面是一个基本的示例 Docker Compose 文件,它使用 "Liquibase" 来管理 PostgreSQL 的数据库 schema 版本:

version: '3'
services:
  liquibase:
    image: liquibase/liquibase:4.4.3
    volumes:
      - ${PWD}/changelog:/liquibase/changelog
    environment:
      - LIQUIBASE_URL=jdbc:postgresql://postgres:5432/liquibase
      - LIQUIBASE_USERNAME=liquibase
      - LIQUIBASE_PASSWORD=liquibase
    depends_on:
      - postgres

  postgres:
    image: postgres:13-alpine
    restart: always
    environment:
      - POSTGRES_USER=liquibase
      - POSTGRES_PASSWORD=liquibase
    ports:
      - '5432:5432'

上述 Docker Compose 文件中,我们使用的是 "liquibase/liquibase:4.4.3" 镜像,它也包含了基本的 "Liquibase" 客户端工具。我们将 PostgreSQL 作为后端数据存储。

changelog/ 目录中,我们可以放置 XML 或 YAML 脚本,"Liquibase" 将会在启动时自动执行这些脚本,并记录每一个版本号。

使用 Liquibase 进行自动同步

下面我们演示如何在 PostgreSQL 数据库中使用 "Liquibase" 来自动同步表结构。

我们在 changelog/ 目录下创建一个 XML 格式的脚本文件 0001_create_user_table.xml,它用于创建一个名为 user 的数据表。如下是 XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
    <changeSet id="0001" author="alice">
        <createTable tableName="user">
            <column name="id" type="BIGINT" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="name" type="VARCHAR(255)">
                <constraints nullable="false"/>
            </column>
        </createTable>
    </changeSet>
</databaseChangeLog>

然后,我们将这个 XML 脚本文件添加到我们的代码版本控制工具中。

接下来,我们使用以下命令启动 "Liquibase" 服务:

docker-compose up -d

当服务启动完成后,我们可以使用以下命令检查表结构是否已经创建成功:

docker-compose exec postgres psql -U liquibase -c "SELECT * FROM user;"

现在我们尝试增加一个新列来修改我们的 "user" 数据表。

我们在 changelog/ 目录下新建一个 XML 格式的脚本文件 0002_add_email_column.xml。如下是 XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
    <changeSet id="0002" author="bob">
        <addColumn tableName="user">
            <column name="email" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>

之后,我们再次使用以下命令重启 "Liquibase" 服务,它会自动检测到新添加的 XML 脚本文件和之前版本的差异,并自动升级 "user" 数据表结构。

docker-compose up -d

现在我们可以使用以下命令检查 "user" 数据表是否添加了新的列:

docker-compose exec postgres psql -U liquibase -c "SELECT * FROM user;"

以上就是使用 "Flyway" 和 "Liquibase" 自动化同步表结构的基本流程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySql开发之自动同步表结构 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程

    好的。 以下是编译安装PHP7并安装Redis扩展与Swoole扩展的完整攻略。 环境准备 在开始过程之前需要先安装必要的软件: GCC 4.8+ 或 Clang Bison 2.7+,Flex 2.5.35+ 和 re2c 0.13.6+ OpenSSL 开发包 1.0.x 或 1.1.x libxml2 开发包 2.7.0+ libcurl 开发包 7.…

    database 2023年5月22日
    00
  • redis 解决key的乱码问题,并清理详解

    下面是关于如何解决Redis中键名乱码问题以及相应的清理方法的完整攻略。 1. 问题背景 在Redis中,键名可能会出现乱码的情况,这种情况一般是由于Redis服务器和客户端之间采用的不同字符集导致的。如果在Redis键名中包含有非ASCII字符(如中文),在某些情况下,这些字符会被转换为乱码。这样会导致我们无法通过键名查询到相应的键值,造成数据访问的问题。…

    database 2023年5月22日
    00
  • 通过Nginx+Tomcat+Redis实现持久会话

    让我来为您讲解“通过Nginx+Tomcat+Redis实现持久会话”的完整攻略。 概述 在实际开发中,为了保证用户的登录状态不会因为网络中断或服务器重启等原因而被丢失,我们需要使用持久性的会话。而通过将会话信息存储在Redis中,可以实现跨服务器的会话管理,而使用Nginx作为反向代理服务器,则可以优化请求分发,提高系统性能。 步骤 1. 安装Nginx …

    database 2023年5月22日
    00
  • Ubuntu 14.04安装java的方法以Ubuntu14.04为例

    Ubuntu 14.04安装java的方法以Ubuntu14.04为例 Java是一种跨平台的编程语言,广泛地运用于Web应用程序、企业管理系统等方面。在Ubuntu 14.04上安装Java会使得我们可以在系统中运行Java程序。本文将介绍如何在Ubuntu 14.04上安装Java. 安装openjdk Ubuntu 14.04默认使用的是OpenJDK…

    database 2023年5月22日
    00
  • MongoDB备份和恢复方法详解

    MongoDB是一个高性能、可扩展的NoSQL数据库,很多应用程序和网站都选择使用MongoDB作为数据存储系统。作为一种关键的数据存储系统,备份和恢复数据是MongoDB管理的重要任务之一。 在本文中,我们将详细介绍如何备份和恢复MongoDB数据。 备份数据 MongoDB提供了多种备份数据的方式,包括mongodump、mongoexport、文件系统…

    MongoDB 2023年3月14日
    00
  • Redis删除策略

    Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的token或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能 set key的时候,都可以给一个expire time,就是过期时间,通过过…

    Redis 2023年4月13日
    00
  • SQL 创建水平直方图

    当需要可视化数据分布时,水平直方图是一种有效的方式。以下是使用SQL创建水平直方图的完整攻略,包含两条实例。 准备数据 在进行水平直方图绘制之前,需要准备数据,下面创建一个示例表: CREATE TABLE sales ( salesperson varchar(50), amount decimal(10, 2) ); INSERT INTO sales(…

    database 2023年3月27日
    00
  • Mysql数据库乱码问题的对应方式

    关于Mysql数据库乱码问题的对应方式,一般有以下几种: 1. 设置字符编码 在建表时必须指定字符编码。一般情况下,使用utf8或utf8mb4编码能够解决绝大部分的乱码问题。 比如我们要新建一个数据库testdb,并在其中创建一张表testtable: CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部