sqlite3数据迁移到mysqlmysql
经过一些现成的数据库链接工具(sqlite studio、valentina studio)导出导入sql文件sql
一、sqlite数据库数据没法导出隐藏字段rowidshell
二、sqlite数据库数据导出格式与其余数据库不兼容,如单引号、双引号问题数据库
三、导出的sqlite数据不带列名,以下 INSERT INTO protocol VALUES('大类页(新)', ' ')。咱们可能须要的是 INSERT INTO protocol('text1','text2') VALUES('大类页(新)', '刷新页')工具
为了实现方案简单,这里采用脚本命令的方式code
一、解决字段列名没有输出问题sqlite
运行sqlite3命令“ pragma table_info(表名); “获得如下输出内容ip
0|name|TEXT|0||0rem
1|description|TEXT|0||0字符串
再经过字符串替换获得列名,以下:
假设变量为 COLS = name,description
二、解决单引号、双引号问题
运行sqlite3命令“ .mode insert && .dump 表名“获得以下输出内容
INSERT INTO表名VALUES('test',' test');
INSERT INTO表名VALUES('test','test');
INSERT INTO表名VALUES('test','test');
以这种方式能够解决单引号双引号问题,这里直接统一输出单引号
三、解决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');
四、经过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');
五、转义符处理 若是数据库里的数据存在转义符,如:{"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