博客的数据库从sqlite迁移到mysql

背景

(这是导入的之前个人博客上的文章)
之前的服务器挂了,换了一个windows的暂时使用。
配置比较低,也是嫌麻烦,不打算直接在虚拟机上安装mysql,而是用新账号申请了一个1元试用1个月的mysql数据库。

不过区域没选对,不能和虚拟机直接访问,只能通过公网ip,不过关系不大,也能用,又不是跑高端业务~

数据库打算从本地的sqlite换成mysql(话说blog文字都是存在字段里,是否mongodb这种的会比较好呢。。。)

搜索

在网上搜了一下如何迁移,SO上这个问题migrating my SQLite database to mysql提供了脚本转换sql的方法,不过试了一下,不是很好用。
而且博客里的文字中,有一些特殊字符也会被替换。

不过原始问题中这个回答倒是启发了我,直接通过.net的ORM库进行转换。

实践

首先创建mysql数据库,这里我利用了原始项目的migration创建(其实似乎可以不要的)。

然后新建一个工程用以迁移数据库,具体操作就是新建两个DbContext代表原始数据库和目标数据库,然后把每个DbSet遍历拷贝即可,逻辑很简单,只要配好使用的数据库provider和ConnectionString。

		public static async Task MirgrateAsync()
        {
            using (var src = new AppDbContextSrc())
            {
                using (var dst = new AppDbContextDst())
                {
                    //author
                    Console.WriteLine("Reading Authors from src...");
                    var authors = await src.Authors.ToListAsync();
                    Console.WriteLine("Writing Authors to dst...");
                    await dst.Authors.AddRangeAsync(authors);

                    //blogposts
                    Console.WriteLine("Reading BlogPosts from src...");
                    var posts = await src.BlogPosts.ToListAsync();
                    Console.WriteLine("Writing BlogPosts to dst...");
                    await dst.BlogPosts.AddRangeAsync(posts);
                    Console.WriteLine("Being Commit");
                    await dst.SaveChangesAsync();
                    Console.WriteLine("End Commit");
                    Console.WriteLine("====================================================");

                    //customfields
                    Console.WriteLine("Reading CustomFields from src...");
                    var cust = await src.CustomFields.ToListAsync();
                    Console.WriteLine("Writing CustomFields to dst...");
                    await dst.CustomFields.AddRangeAsync(cust);

                    //htmowidgets
                    Console.WriteLine("Reading HtmlWidgets from src...");
                    var widgets = await src.HtmlWidgets.ToListAsync();
                    Console.WriteLine("Writing HtmlWidgets to dst...");
                    await dst.HtmlWidgets.AddRangeAsync(widgets);

                    //newsletters
                    Console.WriteLine("Reading Newsletters from src...");
                    var nl = await src.Newsletters.ToListAsync();
                    Console.WriteLine("Writing Newsletters to dst...");
                    await dst.Newsletters.AddRangeAsync(nl);

                    //users
                    Console.WriteLine("Reading Users from src...");
                    var users = await src.Users.ToListAsync();
                    Console.WriteLine("Writing Users to dst...");
                    await dst.Users.AddRangeAsync(users);

                    Console.WriteLine("Being Commit");
                    await dst.SaveChangesAsync();
                    Console.WriteLine("End Commit");
                    Console.WriteLine("====================================================");
                }
            }
        }

一开始拷贝完成忘了调用SaveChangesAsync结果没有保存。。。

posted @ 2020-03-31 21:37  mosakashaka  阅读(198)  评论(0编辑  收藏  举报