背景
(这是导入的之前个人博客上的文章)
之前的服务器挂了,换了一个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
结果没有保存。。。