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