sqlite3怎么迁移mysql_sqlite3迁移mysql问题集合攻略

本文详细列举了sqlite3数据迁移到mysql过程中可能遇到的问题,包括字段列名缺失、单引号处理、rowid显示、列名插入、转义符等问题,并提供了相应的解决方案,旨在帮助移动开发者顺利进行数据库迁移。
摘要由CSDN通过智能技术生成

原标题:sqlite3迁移mysql问题集合攻略

简述

适合阅读对象:移动开发

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|deion|TEXT|0||0

再通过字符串替换得到列名,如下:

假设变量为 COLS = name,deion

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',' deion')VALUES(1,'test',' test');

INSERT INTO表名('name',' deion')VALUES(2,'test','test');

INSERT INTO表名('name',' deion')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

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值