您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页sqlite3迁移mysql可能遇到的问题集合

sqlite3迁移mysql可能遇到的问题集合

来源:华拓科技网


同时使用shell方式可以用很少的代码量实现。

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'
方案实现

此脚本主要解决了以上1~5问题,根据需要可以对脚本进行修改

 #!/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

总结

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务