加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

sqlite3迁移mysql可能遇到的问题有哪些

发布时间:2022-02-10 12:20:48 所属栏目:MySql教程 来源:互联网
导读:小编给大家分享一下sqlite3迁移mysql可能遇到的问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 问题列表 1、sqlite3 dump出的各种变量在mysql不识别,如(BEG
       小编给大家分享一下sqlite3迁移mysql可能遇到的问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
 
问题列表
 
1、sqlite3 dump出的各种变量在mysql不识别,如(BEGIN TRANSACTION、COMMIT等等)
 
2、sqlite数据库数据无法导出隐藏字段rowid
 
3、sqlite数据库数据导出格式与其他数据库不兼容,如单引号、双引号问题
 
4、导出的sqlite数据不带列名,如下 INSERT INTO protocol VALUES('大类页(新)', ' ') 。我们可能需要的是 INSERT INTO protocol('text1','text2') VALUES('大类页(新)', '刷新页')
 
5、特殊符号处理,如转义符 ""
 
6、表字段长度限制不一样
 
7、数据量写入效率问题
 
问题解决
 
首先不能使用sqliteStudio、Navicat等工具,这里采用shell命令的方式,直接避免一下内容生成,
 
    BEGIN TRANSACTION
 
    COMMIT
 
    CREATE UNIQUE INDEX
 
    PRAGMA foreign_keys=OFF
 
同时使用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
以上是“sqlite3迁移mysql可能遇到的问题有哪些”这篇文章的所有内容,感谢各位的阅读!

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!