在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
简述 适合阅读对象:移动开发 sqlite3数据迁移到mysql会遇到许多语法问题,想要一下列出所有问题会力所不及,本文会尽量多的列出可能会遇到的问题,因为每个人遇到的问题都不一样。读者根据此文可以提前预知是否有自己会面临到的问题,做到心中有数才能避免或减少迁移数据后会发生意料之外的问题。根据问题列表可以了解自己需要解决哪些问题,我这里同时会给出一个解决方案供大家参考。迁移这个问题不会有一个万能的方案的,因为每个人遇到的问题不同,如果一些互相冲突的问题同时存在解决方案中反而就变成了一个问题。 好了,开门见山! 问题列表 1、sqlite3 dump出的各种变量在mysql不识别,如(BEGIN TRANSACTION、COMMIT等等) 2、sqlite数据库数据无法导出隐藏字段rowid 3、sqlite数据库数据导出格式与其他数据库不兼容,如单引号、双引号问题 4、导出的sqlite数据不带列名,如下 5、特殊符号处理,如转义符 "\" 6、表字段长度限制不一样 7、数据量写入效率问题 问题解决 首先不能使用sqliteStudio、Navicat等工具,这里采用shell命令的方式,直接避免一下内容生成,
同时使用shell方式可以用很少的代码量实现。 1、解决字段列名没有输出问题 运行sqlite3命令“
再通过字符串替换得到列名,如下: 假设变量为 COLS = name,description 2、解决单引号、双引号问题 运行sqlite3命令“
以这种方式可以解决单引号双引号问题,这里直接统一输出单引号 3、解决sqlite3默认字段rowid无法显示问题,这里直接将rowid改为id 将当前模式设置为.dump insert 模式 运行sqlite3命令“
4、通过shell字符串命令,将之前得到的列名添加到以下sql语句 修改后如下:
5、转义符处理 如果数据库里的数据存在转义符,如: 此脚本主要解决了以上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 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对极客世界的支持。 |
请发表评论