当前位置: 首页 > news >正文

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没有条目。

相关文章:

Rust SQLx CLI 同步迁移数据库

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

批量生成不同用户的pdf 文件(html样式)

技术 selenium thymeleaf itextpdf chromedriver 使用thymeleaf 将动态数据替换 使用selenium chromedriver 进行js &#xff0c;css等逻辑运算后渲染视图 使用itextpdf 将html 转为pdf 文件 html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf…...

混淆零碎知识点

minifyEnabled true //混淆开关 zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件 &#xff08;必须要混淆开了之后才才可以设置为true&#xff09; proguard-rules.pro 为混淆文件 //整个文件保留 不被混淆 -keep class com.cn…...

排序算法2

排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现&#xff0c;复杂度较高)的排序算法&#xff0c;不适合于数据量较大的场景&#xff0c;比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…...

【Web开发基础学习——corsheaders 应用的理解】

Web开发基础学习系列文章目录 第一章 基础知识学习之corsheaders 应用的理解 文章目录 Web开发基础学习系列文章目录前言一、使用1.1 安装1.2 配置 二、功能总结 前言 corsheaders 是一个 Django 第三方应用&#xff0c;用于处理跨域资源共享 (CORS)。CORS 是一种机制&#x…...

Redis和MySQL之间如何进行数据同步

原因 为什么要进行Redis和MySQL的数据同步&#xff1f; 性能优化&#xff1a;MySQL是关系型数据库&#xff0c;数据读取和存储相对复杂&#xff1b;Redis是内存数据库&#xff0c;读写速度极快&#xff0c;将热点数据存在Redis&#xff0c;可以大大提高系统的访问速度。 数据…...

css:转换

转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比&#xff0c;可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…...

状态管理与存储:Vuex 和 sessionStorage

1. sessionStorage 存储位置 sessionStorage 是浏览器提供的 Web Storage API 的一部分&#xff0c;用于在一个会话期间存储数据。数据保存在浏览器的 内存 中&#xff0c;而不是在硬盘上&#xff0c;且其生命周期仅限于当前浏览器标签页。数据在浏览器窗口或标签页关闭时会被…...

Redis和MySQL保持一致性的延迟双删(Delay Double Delete)策略

Redis和MySQL保持一致性的延迟双删&#xff08;Delay Double Delete&#xff09;策略&#xff0c;是一种在数据更新或删除时为了保证数据一致性而采取的方法。以下是延迟双删的过程和原理的详细解释&#xff1a; 一、过程 第一次删除缓存&#xff1a; 当需要更新数据库中的数据…...

快速理解微服务中Fegin的概念

一.由来 1.在传统的架构里面&#xff0c;我们是通过使用RestTemplate来访问其他的服务&#xff0c;但是这种方式就存在了一个很大的缺陷&#xff0c;也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)&#xff0c;那么调用方也需要同步的在代码里面进行修改&#xff0c;…...

新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布

2024年11月28日&#xff0c;MeterSphere开源持续测试工具正式发布v3.5版本。 在这一版本中&#xff0c;MeterSphere新增工作台模块&#xff0c;工作台可以统一汇总系统数据&#xff0c;提升测试数据的可视化程度并增强对数据的分析能力&#xff0c;为管理者提供测试工作的全局…...

快速搭建一个博客!!!“Halo框架深度优化:搭建你的个性化博客或网站”

目录 引言&#xff1a; 一. 首先服务器上去下载一个docker 1.可以参考官方地址&#xff1a; 2. 通过宝塔来一键安装&#xff01;&#xff01;&#xff01; 3.也可以自己下载&#xff01;&#xff01;&#xff01; 1.卸载旧版 2.配置Docker的yum库 3.安装Docker 4.启动和…...

009 STM32 HAL库介绍

STM32 HAL库&#xff08;Hardware Abstraction Layer&#xff09;是STMicroelectronics为STM32系列微控制器提供的一套硬件抽象层库&#xff0c;它旨在简化STM32的开发过程&#xff0c;提高代码的可移植性和可维护性。HAL库通过提供一组统一的API接口&#xff0c;使得开发者无需…...

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题&#xff1a;在远程调用另一个服务时&#xff0c;我们采用的解决办法是发送一次http请求&#xff0c;每次环境的变更会产生新的地址&#xff0c;所以采用硬编码会出现很多麻烦&#xff0c;并且为了应对并发问题&#xff0c;采用分布式部署&#…...

6.算法移植第六篇 YOLOV5/rknn生成可执行文件部署在RK3568上

接上一篇文章best-sim.rknn模型生成好后&#xff0c;我们要将其转换成可执行文件运行在RK3568上&#xff0c;这一步需要在rknpu上进行&#xff0c;在强调一遍&#xff01;&#xff01;rknpu的作用是可以直接生成在开发板上运行的程序 退出上一步的docker环境 exit1.复制best-…...

element的el-table表格标题用css自定义是否必填,用添加伪类的方式标红色*

element的el-table表格标题用css自定义是否必填添加伪类红色 * 效果图如下&#x1f447; el-table组件的html部分 css部分 /deep/.el-table__header-wrapper{.el-table__header{.has-gutter tr .el-table__cell:nth-of-type(3) .cell:before{content: *;color:red}.has-gutte…...

数据仓库: 8- 数据仓库性能优化

CSDN 目录展示 目录 8- 数据仓库性能优化8.1 查询优化8.1.1 索引优化8.1.2 分区和分桶8.1.3 使用缓存8.1.4 查询简化与重写8.1.5 聚合优化8.1.6 并行化和分布式计算8.1.7 基于列存储的优化8.1.8 表的分区和数据清洗8.1.9 查询提示 (Hints)8.1.10 自动调优工具 8.2 索引设计8.2…...

可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望

目录 可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望 可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望 在分布式深度学习领域,随着模型规模的不断扩大,训练过程中的通信开销已成为制约性能提升的关键因素。传统的分布式训练方法面临高通信延迟和带宽…...

【论文笔记】Tool Learning with Foundation Models 论文笔记

Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景&#xff1a;工作&#xff1a; 引言工具学习的发展本文工作&#xff08;大纲&目录&#xff09; 背景2.1 工具使用的认知起源2.2 工具分类&#xff1a;用户界…...

Springfox迁移到 Springdoc OpenAPI 3

将项目从 Springfox 迁移到 Springdoc OpenAPI 3 时&#xff0c;主要的工作是将原先使用的 Springfox 注解替换为 Springdoc OpenAPI 3 中的对应注解。虽然 Springdoc OpenAPI 3 基于 OpenAPI 3 规范&#xff0c;并且有一些不同的命名方式和设计理念&#xff0c;但大部分注解的…...

DIY-Tomcat part 3 实现对动态资源的请求

实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…...

3.10 内核 BUG_ON() at xfs_vm_writepage() -> page_buffers()

目录 前言 问题分析 page buffers创建 page buffers丢失 Write-Protect Dirty Page w/o Buffers 问题解决 前言 这个问题发生在3.10.0-514.el7上&#xff0c;并且在RHEL的知识库中快速找到了对应的案例以及解决方案&#xff0c;但是&#xff0c;理解问题如何发生和解决…...

CrystalDiskInfo:硬盘健康监测工具简介和下载

原论坛给你更好的阅读体验&#xff1a;CrystalDiskInfo&#xff1a;硬盘健康监测工具简介和下载 | 波波论坛 引言 在日常使用电脑时&#xff0c;硬盘的健康状态对于系统的稳定性和数据的安全性至关重要。硬盘出现故障可能会导致数据丢失&#xff0c;严重时甚至会使整个系统无…...

Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!

问题 我使用flink cdc同步mysql到mysql遇到了timestamp字段缺少八小时的问题。很少无语&#xff0c;flink ,cdc,debezium时区都设置了&#xff0c;没有任何效果&#xff01; 分析 问题出现在mysql binlog身上&#xff01;&#xff01;&#xff01; 因为默认mysql会使用UTC来…...

【docker】9. 镜像操作与实战

镜像操作案例 查找镜像 docker search busybox下载镜像 docker pull busybox:1.36.0查看镜像及列表存储位置 rootLAPTOP-H2EI4I6A:~# docker images busybox REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 517b897a6a83 2 months a…...

js-显示转换(强制转换)与隐式转换,==与===区别

1.显示转换(强制转换)与隐式转换 1.1显示转换 常见的JavaScript强制转换示例。 &#xff08;1&#xff09; 一元加号、一元减号- 值是布尔值&#xff0c;true将被转换为1&#xff0c;false将被转换为0。 let a "123"; let b a; // b的值为123&#xff0c;类型为Nu…...

【通俗理解】步长和学习率在神经网络中是一回事吗?

【通俗理解】步长和学习率在神经网络中是一回事吗&#xff1f; 【核心结论】 步长&#xff08;Step Size&#xff09;和学习率&#xff08;Learning Rate, LR&#xff09;在神经网络中并不是同一个概念&#xff0c;但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…...

【PTA】【数据库】【SQL命令】编程题2

数据库SQL命令测试题2 测试题目录 10-1 查询“李琳”老师所授课程的课程名称10-2 查询成绩比所有课程的平均成绩高的学生的学号及成绩10-3 创建带表达式的视图StuView10-4 从视图PerView中查询数据10-5 查询工资高于在“HR”部门工作的所有员工的工资的员工信息10-6 查询选修的…...

Spring Boot林业产品推荐系统:用户指南

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此林业产品销售信…...

【Conda 】Conda 配置文件详解:优化你的包管理与环境设置

目录 引言一、什么是 .condarc 文件&#xff1f;二、.condarc 文件的详细解析与优化2.1 SSL 验证2.2 设置 Conda 下载源2.3 设置环境和包存储路径2.4 代理服务器设置2.5 连接超时设置2.6 显示频道 URL2.7 包版本与构建选择2.8 环境依赖性管理2.9 禁用默认包版本2.10 Conda 配置…...

山西建筑网站设计设计/济南百度推广代理商

主要讲解了 MOS管子 运放 三极管的知识。...

做移动网站优化快速排名软件/东莞营销网站建设优化

https://blog.csdn.net/shwan_ma/article/details/78879620 一般来说&#xff0c;打印tensorflow变量的函数有两个&#xff1a;tf.trainable_variables () 和 tf.all_variables()不同的是&#xff1a;tf.trainable_variables () 指的是需要训练的变量tf.all_variables() 指的是…...

网站服务器是网站的空间吗/推广网站排名

前言 Apollo是携程框架部门研发的开源配置管理中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端。本文介绍了配置的概念、配置中心的必要性以及Apollo的特点&#xff0c;着重拆解分析Apollo客户端的设计原理&#xff0c…...

wordpress推荐文章/百度推广收费多少

论文翻译 论文作者讲解 解决问题 现有评价标准过高的评估模型效果&#xff08;现有标准一般是accuracy或者 F1 这种标准度量&#xff09; 解决对策 由软件测试方法得来灵感 建立 CheckList 流程框架&#xff1a; 测试一些独立的最小单元组件&#xff08;例如&#xff0c;区分词…...

wordpress怎么开启/sem和seo区别与联系

设计思想与代码规范均借鉴明德扬至简设计法&#xff0c;有不足之处希望大家多提建议&#xff0c;真正做到至简设计。本篇着重提出FPGA通用设计思想&#xff0c;以计数器为核心的代码规范以及VIVADO debug操作流程。  此次试验旨在通过串口试验&#xff0c;讲述FPGA的硬件设计…...

廊坊建站模板系统/品牌推广运营策划方案

cmd下tracter //路由追踪//服务开关net start PPTVServicenet stop Spooler输入“ipconfig /release”&#xff0c;按“Enter”键&#xff0c;将释放IP地址。输入“ipconfig /renew” &#xff0c;按“Enter”键&#xff0c;将重新获取IP地址。在所在的网络中使用net view命令…...