Rust SQLx CLI 同步迁移数据库

上文我们介绍了SQLx及SQLite,并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具,介绍如何安装、使用,利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似,利用命令行工具可以和其他语言项目工程一起使用。

数据库迁移是开发和重构应用程序数据库的过程,是应用程序开发过程的一部分。SQLx CLI是Rust crate SQLx的关联命令行实用程序,用于管理此迁移过程。在这篇文章中,我们将看看如何在Ubuntu 22.10上对MySQL使用这个命令行工具。

在尝试了SQLx CLI之后,我想说,我们实际上可以将这个CLI作为一种通用工具来管理用Rust以外的语言编写的应用程序的数据库开发。我真的很喜欢这个CLI。

SQLx CLI 安装

在这里插入图片描述

安装openssl

SQLx CLI文档没有提到它,但它似乎确实需要OpenSSL。我只是在尝试安装失败后才发现这个。在Ubuntu 22.10上,第一次安装尝试没有通过,它需要OpenSSL。详细日志请参见Ubuntu 22.10 SQLx CLI Failure Installation logs。

要安装OpenSSL,运行:

$ sudo apt install pkg-config

sqlx cli 安装

我们使用cargo安装SQLx CLI。在哪个目录下运行安装命令并不重要, 在Ubuntu 22.10上, 默认目录为:/home/ username /.cargo/bin/。最好把该目录添加至环境变量中,方便后续在项目中使用。

$ cargo install sqlx-cli

同步迁移数据库

数据库连接

SQLx CLI 使用.env文件和命令行选项--database-url。我们稍后将使用.env文件,我们可以根据应用程序的需要向该文件添加更多运行时信息,.env文件应该与Cargo.toml文件放在同一个目录中。

我们实际上并不需要一个现有的Rust项目来启动数据库迁移过程。但这里新建项目为了演示迁移过程。

在特定目录下,创建一个新项目sqlx-mysql-migration,并更改到项目目录:

$ cargo new sqlx-mysql-migration
$ cd sqlx-mysql-migration/

创建 .env 文件

在项目根目录下,新建.env 文件,增加数据库连接信息:

DATABASE_URL=mysql://root:passw0rd@localhost:3306/membership

我们以前在其他Rust代码中见过DATABASE_URL的值,在本例中,我们使用membership数据库。

创建数据库

现在我们已经准备好了DATABASE_URL,当然目标MySQL服务器也在运行,我们用以下命令创建数据库:

$ sqlx database create

如果没有问题,就不会有输出。我们应该使用MySQL Workbench来验证数据库是否已经创建。

我们可以删除数据库:

$ sqlx database drop

它会要求确认。同样,我们可以使用MySQL Workbench来验证数据库是否已被删除。请注意,从这一点开始,我们需要数据库存在。

初始化脚本

创建第一个数据库脚本。该命令的格式为:

## $ sqlx migrate add -r <name> 
## 首个脚本我们使用init 作为name
$ sqlx migrate add -r initCreating migrations/20241126021418_init.up.sql
Creating migrations/20241126021418_init.down.sqlCongratulations on creating your first migration!Did you know you can embed your migrations in your application binary?
On startup, after creating your database connection or pool, add:sqlx::migrate!().run(<&your_pool OR &mut your_connection>).await?;
...

已经创建了名为migrations/的子目录,其中有两(2)个空文件20231008021418_init.up。SQL和20231008021418_init.down.sql。

在对应用程序数据库进行了一些更改之后,由于某些原因,我们可能希望恢复这些更改。20231008021418 _init.up.sql脚本文件是我们编写sql语句来更新数据库的地方; 脚本文件20231008021418_init.down.sql是我们编写sql语句来撤销20241126021418_init.up.sql。

migrations/20241126021418_init.up.sql 文件的内容:

ALTER DATABASE `membership` DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;DROP TABLE IF EXISTS `member`;
CREATE TABLE `member` (`id` int NOT NULL,`email` VARCHAR(255) NOT NULL,`password` varchar(100) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(32) NOT NULL,`last_name` varchar(32) NOT NULL,`gender` enum('M','F') NOT NULL,`joined_date` date NOT NULL,`created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE KEY `email_unique` (`email`)
);

基本上,我们修改membership数据库的一些属性,然后创建第一个表:member。

20231008021418_init.down.sql 文件内容:

DROP TABLE IF EXISTS `member`;

我们撤销up脚本所做的工作:从数据库中删除成员表

运行初始化迁移

让我们运行init迁移。命令为:

$ sqlx migrate run

MySQL Workbench显示已经创建了成员表,并且还有一个额外的表_sqlx_migrations,其中有一行,这一行应该是不言自明的。让我们撤销它。命令为:

$ sqlx migrate revert

验证成员表是否已被删除,并且表_sqlx_migrations为空?

更新数据脚本1

让我们创建另一个数据库更新脚本,我们将其命名为stage1:

$ sqlx migrate add -r stage1

自动创建新的文件, 结尾_stage1.up.sql, 修改内容:

DROP TABLE IF EXISTS `duration`;
CREATE TABLE `duration` (`id` smallint NOT NULL,`months` smallint NOT NULL,`expiry_date` date NULL,PRIMARY KEY (`id`)
) comment='Membership duration in months.';insert into duration ( id, months )
values( 1, 6 ),( 2, 12 ),( 3, 18 ),( 4, 24 );

同时修改_stage.down.sql文件内容:

DROP TABLE IF EXISTS `duration`;

运行 stage1 命令:

$ sqlx migrate run

表_sqlx_migrations现在应该包含两个条目。还应该创建表持续时间。

回退操作

$ sqlx migrate revert

stage1 被回退,duration表被删除。

再次执行回退:

$ sqlx migrate revert

我们可以看到,最后一个更新首先被撤消。另外,成员数据库现在是一个空数据库。并且表_sqlx_migrations没有条目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480988.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【天地图】HTML页面实现车辆轨迹、起始点标记和轨迹打点的完整功能

目录 一、功能演示 二、完整代码 三、参考文档 一、功能演示 运行以后完整的效果如下&#xff1a; 点击开始&#xff0c;小车会沿着轨迹进行移动&#xff0c;点击轨迹点会显示经纬度和时间&#xff1a; 二、完整代码 废话不多说&#xff0c;直接给完整代码&#xff0c;替换…

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…

Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。

项目启动5分钟&#xff0c;很明显有问题。像网上其他的提高jvm参数就不说了&#xff0c;应该不是这个问题&#xff0c;也就快一点。 首先找到自己的电脑名称&#xff08;用命令行也行&#xff0c;只要能找到自己电脑名称就行&#xff0c;这里直接在共享里看&#xff09;。 复制…

实时美颜直播APP开发指南:美颜sdk与美颜api的应用实践

本篇文章&#xff0c;小编将探讨如何在直播APP中实现实时美颜功能&#xff0c;重点介绍美颜sdk与api的应用实践。 一、什么是实时美颜技术&#xff1f; 实时美颜技术&#xff0c;通常通过图像处理算法&#xff0c;基于主播或用户的实时视频流&#xff0c;进行面部特征的优化。…

【纯原生js】原生实现h5落地页面中的单选组件按钮及功能

h5端的按钮系统自带的一般都很丑&#xff0c;需要我们进行二次美化&#xff0c;比如单选按钮复选框之类的&#xff0c;那怎么对其进行html和css的改造&#xff1f; 实现效果 实现代码 <section id"tags"><h2>给景区添加标题</h2><label><…

win10系统安装docker-desktop

1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术&#xff0c;它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…

阿里云人工智能平台(PAI)免费使用教程

文章目录 注册新建实例交互式建模(DSW)注册 注册阿里云账号进行支付宝验证 新建实例 选择资源信息和环境信息,填写实例名称 资源类型需要选择公共资源,才能使用资源包进行抵扣。目前每月送250计算时。1 * NVIDIA A10 8 vCPU 30 GiB 1 * 24 GiB1 * NVIDIA V100 8 vCPU 32 Gi…

TongRDS分布式内存数据缓存中间件

命令 优势 支持高达10亿级的数据缓冲&#xff0c;内存优化管理&#xff0c;避免GC性能劣化。 高并发系统设计&#xff0c;可充分利用多CPU资源实现并行处理。 数据采用key-value多索引方式存储&#xff0c;字段类型和长度可配置。 支持多台服务并行运行&#xff0c;服务之间可互…

即时通讯| IM+RTC在AI技术加持下的社交体验

即时通讯作为互联网的重要应用之一&#xff0c;见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流&#xff0c;发展到如今的语音、视频通话&#xff0c;甚至是虚拟现实社交&#xff0c;已经渗透到生活的社交、娱乐、商务等方方面面&#xff0c;成为现代社会不可或缺的一…

Redis(5):哨兵

一、作用和架构 1. 作用 在介绍哨兵之前&#xff0c;首先从宏观角度回顾一下Redis实现高可用相关的技术。它们包括&#xff1a;持久化、复制、哨兵和集群&#xff0c;其主要作用和解决的问题是&#xff1a; 1&#xff09;持久化&#xff1a;持久化是最简单的高可用方法(有时甚…

Linux -初识 与基础指令1

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【Linux】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4da; 前言&#x1f5a5;️ 初识&#x1f510; 登录 root用户&#x1f465; 两种用户➕ 添加用户&#x1f9d1;‍&#x1f4bb; 登录 普通用户⚙️ 常见…

【娱乐项目】基于批处理脚本与JavaScript渲染视频列表的Web页面

Demo介绍 一个简单的视频播放器应用&#xff0c;其中包含了视频列表和一个视频播放区域。用户可以通过点击视频列表中的项来选择并播放相应的视频&#xff0c;播放器会自动播放每个视频并在播放完毕后切换到下一个视频。本项目旨在通过自动化脚本和动态网页渲染&#xff0c;帮助…

k8s集成skywalking

如果能科学上网的话&#xff0c;安装应该不难&#xff0c;如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容&#xff0c;对于目前大部分采用微服务架构的公司来说&#xff0c;分布式链路追踪都是必备的&#xff0c;无论它是传统微服务体系亦或是新一代…

使用Native AOT发布C# dll 提供给C++调用

Native AOT&#xff0c;即提前本地编译&#xff08;Ahead-Of-Time Compilation&#xff09;&#xff0c;是一种将托管代码&#xff08;如 C#&#xff09;编译为本机可执行文件的技术&#xff0c;无需在运行时进行任何代码生成。 &#xff08;Native AOT 优缺点截图摘自张善友博…

QT:多ui界面显示

文章目录 1.多ui界面添加2.跳转函数3.返回函数4.Qt5源码工程5.模态显示 1.多ui界面添加 最终生成这个目录 2.跳转函数 void MainWindow::on_pushButton_clicked() {//this->setWindowModality(Qt::WindowModal);test1 *t1 new test1();t1->setParentData(this);this-…

cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection

原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection&#xff0c;构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…

【Python网络爬虫笔记】2-HTTP协议中网络爬虫需要的请求头和响应头内容

1 HTTP 协议整理 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;即超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW&#xff09;服务器传输超文本到本地浏览器的传送协议&#xff0c;直白点儿&#xff0c;就是浏览器和服务器之间的数据交互就是通过 HTT…

Echarts散点图(火山图)自定义配置

创建DOM元素 <div><div ref"chat" :style"{width: volcanoDimensions.width,height: volcanoDimensions.height,}" class"chat"></div></div>初始化图表 需要实现&#xff0c;被筛选出的数据&#xff0c;带有label&…

微软企业邮箱:安全可靠的企业级邮件服务!

微软企业邮箱的设置步骤&#xff1f;如何注册使用烽火域名邮箱&#xff1f; 微软企业邮箱作为一款专为企业设计的邮件服务&#xff0c;不仅提供了高效便捷的通信工具&#xff0c;更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…