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

62次阅读
没有评论

共计 2096 个字符,预计需要花费 6 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 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 可能遇到的问题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计2096字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)