MySQL 迁移至 SQLite 问题记录

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 将WPF项目从MySQL迁移到SQLite以简化部署流程。涉及更换Nuget包(Microsoft.Data.Sqlite.Core或System.Data.SQLite),修改SQL语法,如主键和唯一约束的声明,以及处理数据库连接和数据类型差异。SQLite不支持MySQL的truncate语句,需用delete并清理sqlite_sequence表。还需注意逻辑操作符&&需替换为and。更多细节在文中详述。

最近接手了一个WPF项目,数据库使用的MySQL,为了简化生产环境部署流程,果断选择迁移到SQLite,由于原项目未使用ORM框架,导致很多SQL语法也得改。

SQLite基础语法请参考该页面

  1.依赖包的更改

    有两个Nuget包选: Microsoft.Data.Sqlite.Core / System.Data.SQLite,我都安装试了下,除了类型大小写不一致之外,功能几乎一样,由于老项目是.Net Framework 4.x,稳妥起见还是使用了后者,至于各种引用类型的更改,几乎只需要将MySql开头的类型名全局替换成SQLite的则可(记得删掉MySQL的引用,确保只调用了SQLite相关类库)  

    


  2.数据库连接

    SQLite本身是一个基于文件的数据库系统,每个数据库就是一个文件,若文件不存在它会自动创建,下面的示例代码就是建立与运行目录下test.sqlite文件的连接     

 private const string connStr = "Data Source = {0}";
 ...
 string dbName = "test.sqlite";

 SQLiteConnection Connection = new SQLiteConnection(string.Format(connStr, dbName));

 Connection.Open();


  3.数据库切换

    虽然SQLiteConnection也提供了ChangeDatabase方法,但是不管用 o(╥﹏╥)o   得先手动释放原来的连接资源,再建立新的连接

   Connection?.Dispose();

   Connection = new SQLiteConnection(string.Format(connStr, dbName));

   Connection.Open();


  4.建表差异

    编码集和数据引擎的部分肯定是不能要了,主键要将关键字放到对应字段后面,unique约束同理,自增则是去掉下划线(大小写依然不敏感),但是有一个需要注意的地方是:自增字段得用integer,用int也行,但它不会自增

 private const string SQL_CreateTable = @"

               create table if not exists `TestTable` (

                   id int not null auto_increment,                    

                   name varchar(64) not null,

                   primary key(id),
           unique key(name)

               ) collate='utf8_general_ci' engine=InnoDB;";

 //上面是MySQL建表语句
 //下面是SQLite建表语句

 private const string SQL_CreateTable = @"

               create table if not exists `TestTable` (

                   id integer PRIMARY KEY AUTOINCREMENT NOT NULL,                    

                   name varchar(64) not null UNIQUE

               );";

 

 

  5.删表差异 - truncate 语句

    SQLite不支持 truncate ,清空一张表需要先delete,然后再去sqlite_sequence表里删除对应表名的自增键

 new SQLiteCommand(@"delete from tablename;", Connection).ExecuteNonQuery();
 new SQLiteCommand(@"DELETE FROM sqlite_sequence WHERE name = 'tablename';", Connection).ExecuteNonQuery();

 

  6.数据类型差异

    MySqlDbType要更改为DbType,后者位于System.Data命名空间下,具体对照关系参考这个链接,图中的Key值为MySqlDbType类型,Value为对应的DbType类型


    

 

  7.逻辑操作符差异 -- &&符号

    若不是接手这个项目,我都不知道MySQL居然能用 && 操作符,SQLite当然是不支持的,得改成 and 关键字

 

  8.待补充,以后遇到其他问题再补充

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
0
分享
相关文章
【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
**简介**:在MySQL迁移到崖山环境时,若字段类型为char(2),而应用存储的数据仅为'0'或'1',查询时崖山会自动补空格。原因是mysql的sql_mode可能启用了PAD_CHAR_TO_FULL_LENGTH模式,导致保留CHAR类型尾随空格。解决方法是与应用确认数据需求,可将崖山环境中的char类型改为varchar类型以规避补空格问题,适用于所有版本。
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
【YashanDB 知识库】MySQL 迁移至崖山 char 类型数据自动补空格问题
问题分类】功能使用 【关键字】char,char(1) 【问题描述】MySQL 迁移至崖山环境,字段类型源端和目标端都为 char(2),但应用存储的数据为'0'、'1',此时崖山查询该表字段时会自动补充空格 【问题原因分析】mysql 有 sql_mode 控制,检查是否启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。如果启用了这个模式,MySQL 才会保留 CHAR 类型字段的尾随空格,默认没有启动。 #查看sql_mode mysql> SHOW VARIABLES LIKE 'sql_mode'; 【解决/规避方法】与应用确认存储的数据,正确定义数据
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
474 15
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
817 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多