将MySQL数据库导出到SQLite数据库


Answers:


71

Github上有一个很棒的Linux Shell脚本,可以将Mysql转换为Sqlite3文件。您需要在服务器上同时安装mysqldump和sqlite3。效果很好。


到目前为止效果最好!只需要使用sqlite无法识别的编码删除一些“ COLLATE xy”语句即可。请注意,如果要克隆mysql数据库进行本地开发,则不需要在服务器上使用sqlite3。
benzkji 2014年

1
不幸的是对我没用。除了下面提到的“ PRIMARY KEY”语句存在的问题外,还报告了许多其他错误,这些错误与“ INSERT”语句和丢失的表(“对象”)有关。
BartoszKP

2
作者取消了脚本的编写,但仍在此分支中继续工作:github.com/dumblob/mysql2sqlite
ilyaigpetrov

3
github.com/dumblob/mysql2sqlite现在是正式版本。2016-05-11 17:32 GMT+2 @esperlu declared MIT as a fitting license (also retrospectively) and the original gist as deprecated.
叶李昂

1
感谢您的平视ilyaigpetrov和@ Li-aungYip,我已经更新了链接
georgiecasey

7

由@quassy编辑的@ user2111698的答案按预期工作。由于我经常这样做,因此我将他们的说明放入bash脚本中:

#!/bin/bash

mysql_host=localhost
mysql_user=george
mysql_dbname=database
sqlite3_dbname=database.sqlite3

# dump the mysql database to a txt file
mysqldump \
  --skip-create-options \
  --compatible=ansi \
  --skip-extended-insert \
  --compact \
  --single-transaction \
  -h$mysql_host \
  -u$mysql_user \
  -p $mysql_dbname \
  > /tmp/localdb.txt

# remove lines mentioning "PRIMARY KEY" or "KEY"
cat /tmp/localdb.txt \
  | grep -v "PRIMARY KEY" \
  | grep -v KEY \
  > /tmp/localdb.txt.1

# mysqldump leaves trailing commas before closing parentheses  
perl -0pe 's/,\n\)/\)/g' /tmp/localdb.txt.1 > /tmp/localdb.txt.2

# change all \' to ''
sed -e 's/\\'\''/'\'''\''/g' /tmp/localdb.txt.2 > /tmp/localdb.txt.3

if [ -e $sqlite3_dbname ]; then
    mv $sqlite3_dbname $sqlite3_dbname.bak
fi
sqlite3 $sqlite3_dbname < /tmp/localdb.txt.3

可以在https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d找到具有详细注释的要点


如果您设置代码格式以消除滚动,则可以使其他人更容易阅读。
zhon 2016年

高兴; 没有很快地看到
乔治·费希尔

1
如果删除注释,则完成垂直滚动(将您认为重要的任何注释添加到答案文本中)。垂直滚动可以使用反斜杠换行符进行处理。
zhon'9

如果您的sql文件大于1GB,请先将其拆分。否则,perl脚本会给出替换循环错误。
nurp

3

顶部文章中提到的mysql2sqlite.sh不能很好地处理PRIMARY KEY行,也没有编写结尾)来完成CREATE语句。

这就是我所做的。我将mysql dump转储为:

mysqldump --skip-create-options --compatible=ansi --skip-extended-insert --compact --single-transaction -h<host> -u<user> -p<passwd> <database name> > localdb.txt

然后,我使用grep删除了PRIMARY KEY和KEY:

cat localdb.txt | grep -v "PRIMARY KEY' | grep -v KEY > localdb.txt.1

然后,我使用编辑器来修复文件。删除键后,您将得到一条类似于以下内容的CREATE语句:

CREATE ...
  ...,
)

,必须删除该拖尾。在vi中,此表达式与它们匹配,,$ \ n)

然后您需要将所有更改\'''

然后,您可以执行导入:

sqlite3 local.sqlite3 < localdb.txt.1

就是这样。我没有找到适合我的单个程序。我希望这可以帮助别人。


2

我在sqlite数据库中手动创建了表结构。

比我用以下命令上传数据:

mysqldump -u root {database} {table} --no-create-info --skip-extended-insert  --complete-insert --skip-add-locks  --compatible=ansi | sed "s/\\\'/''/g" |sqlite3 flora.db

我不得不使用sed来修复两个数据库中不同的顶点编码


谢谢,这很有帮助,因为原始问题没有指定是否需要包含创建模式。架构已经建立时更简单
kjones

0

就我个人而言,我喜欢mysqldump的简单用法,但仍需要进行一些调整(取决于您使用Unix的技术以及您想做什么)。

例如 只需一张带有PK的桌子(产品):

$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
    Error: near line 1: table "prods" already exists
    Error: near line 7: UNIQUE constraint failed: prods.id, prods.ts
$ sqlite3 testme2.db '.schema'
    CREATE TABLE "prods" (
      "id" varchar(30) NOT NULL DEFAULT '',
      "ts" int(11) NOT NULL DEFAULT '0',
      "val" double DEFAULT NULL,
      PRIMARY KEY ("id","ts")
    );

对于更复杂的事情,可能最好写一个包装器,或者使用Gist上已经提到的 很棒的awk Linux shell脚本


-1

有一个出色的轻量级工具,称为SQLite数据库浏览器,可用于创建和编辑sqlite数据库。我用它来创建Android应用程序的数据库。您可以对其执行SQL语句以加载数据,因此,如果从mySQL数据库中导出数据,则可以使用此工具将其导入。这是链接:http : //sqlitebrowser.sourceforge.net/


2
这对MySQL转换有何帮助?
CL。

2
它可以帮助您准确地完成需要做的事情。实际上,我现在正在这样做。使用mysqldump或phpMyAdmin导出MySQL,然后使用上述工具将其导入sqlite数据库。他要求“将MySQL数据库导出到SQLite数据库中”,并且上面的工具将完全按照您的要求进行操作。拒绝投赞成票是错误的。我在这里是新来的,我的答案不仅解决了这个问题,而且还是我在现实世界中正在使用的东西。不要这么快就无缘无故地投下反对票,并阻止人们参与。
亚伦·拉特纳

2
您省略了实际的第二个(也是最重要的)步骤,将MySQL转储的所有特定于MySQL的部分转换为特定于SQLite或标准语法。
CL。

4
迟了,但是此工具不适用于此问题。它不支持特定于MySQL的语法(仅支持SQLite语法)。为了成功导入转储文件,必须对其进行大量编辑。
Sverri M. Olsen,2014年

5
@AaronRatner不,该解决方案不起作用。该问题明确询问有关转换MySQL数据库的问题,而您推荐的工具不能处理MySQL语法。您不需要亲自处理这个问题-从您所说的来看,我想您就是需要“放松”的人:-)如果有人说您的解决方案对他们没有帮助,他们只是在说一个简单的事实。您的回答“这太难了,因为解决方案很有帮助”,这是荒谬的。我知道这对我没有帮助,因为它不是:-)干杯!
BartoszKP 2015年

-17

用导出数据

  mysqldump database > database.sql

并使用导入数据

  sqlite3 database < database.sql

您可能需要-u(用户)和-p(密码)选项


9
这是否真的可以与mysql中可用的差异和功能一起使用,而在sqlite中不可用?
rzetterberg

5
这是行不通的。索引,表描述,二进制数据转义序列,锁定机制,可能还有其他内容,在MySQL和SQLite之间都是不同的。
CR。

这是一个更好的解决方案:stackoverflow.com/questions/455606/…–
Joseph

4
这是行不通的。请先测试解决方案,然后再发布任何您想到的...
Maciej Jankowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.