sqlite3數據遷移mysql

背景

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
相關文章
相關標籤/搜索