背景

sqlite3数据迁移到mysql

现有方案

通过一些现成的数据库连接工具(sqlite studio、valentina studio)导出导入sql文件

现有方案缺陷

1、sqlite数据库数据无法导出隐藏字段rowid

2、sqlite数据库数据导出格式与其他数据库不兼容,如单引号、双引号问题

3、导出的sqlite数据不带列名,如下 INSERT INTO protocol VALUES('大类页(新)', ' ')。我们可能需要的是 INSERT INTO protocol('text1','text2') VALUES('大类页(新)', '刷新页')

问题解决

为了实现方案简单,这里采用脚本命令的方式

1、解决字段列名没有输出问题

运行sqlite3命令“ pragma table_info(表名); “得到以下输出内容

0|name|TEXT|0||0

1|description|TEXT|0||0

再通过字符串替换得到列名,如下:

假设变量为 COLS = name,description

2、解决单引号、双引号问题

运行sqlite3命令“ .mode insert && .dump 表名“得到如下输出内容

INSERT INTO表名VALUES('test',' test');

INSERT INTO表名VALUES('test','test');

INSERT INTO表名VALUES('test','test');

以这种方式可以解决单引号双引号问题,这里直接统一输出单引号

3、解决sqlite3默认字段rowid无法显示问题,这里直接将rowid改为id

将当前模式设置为.dump insert 模式

运行sqlite3命令“ select rowid as id,$COLS from 表名“得到如下输出

INSERT INTO表名VALUES(1,'test',' test');

INSERT INTO表名VALUES(2,'test','test');

INSERT INTO表名VALUES(3,'test','test');

4、通过shell字符串命令,将之前得到的列名添加到以下sql语句

修改后如下:

INSERT INTO表名('name',' description')VALUES(1,'test',' test');

INSERT INTO表名('name',' description')VALUES(2,'test','test');

INSERT INTO表名('name',' description')VALUES(3,'test','test');

5、转义符处理

如果数据库里的数据存在转义符,如:{"lastname":\\"天津\\"}。这种数据如果不处理,那么将数据insert到数据库时会变成{"lastname":\"天津\"}。所以需要对转义符做下处理,用shell命令处理很简单,如命令:sed 's#\\#\\\\#g'

总结

依照以上思路再通过shell脚本实现即可解决sqlite3迁移数据到MySQL或其他数据库的问题

#!/bin/sh

SQLITE=sqlite3

if [ -z "$1" ] ; then

echo usage: $0 sqlite3.db

exit

fi

DB="$1"

TABLES=`"$SQLITE" "$DB" .tables`

for TABLE in $TABLES ; do

CREATE=`"$SQLITE" "$DB" "SELECT sql FROM sqlite_master WHERE type=\"table\" AND name = \"$TABLE\";"`

echo $CREATE";" |

cut -d'=' -f2 |

sed "s/^CREATE TABLE $TABLE (/CREATE TABLE $TABLE (id int auto_increment primary key ,/g"

COLS=`"$SQLITE" "$DB" "pragma table_info($TABLE)" | cut -d'|' -f2 `

COLS_CS=`echo $COLS | sed 's/ /,/g'`

echo ".mode insert \n.header on \n select rowid as id,$COLS_CS from $TABLE;\n" |

"$SQLITE" "$DB" |

sed "s/^INSERT INTO \"table\"/INSERT INTO $TABLE /g" |

sed 's#\\#\\\\#g'

done

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐