将MySQL转换为SQlite [关闭]


Answers:


78

GitHub上有一个mysql2sqlite.sh脚本

如标题中所述,脚本可以这样使用:

./mysql2sqlite.sh myDbase | sqlite3 database.sqlite

备择方案


8
魅力十足!这里是一些文档: $ ./mysql2sqlite.sh -h host -u MyUserName -pMySecretPassWord myDbase | sqlite3 database.sqlite gist.github.com/943776
kachar 2012年

该脚本仅从命令行提取参数并将其传递给mysqldump,因此您可以使用man mysqlman mysqldump
Devin Howard

2
值得注意的是,此脚本已由此处维护的后继者取代:github.com/dumblob/mysql2sqlite
drzax

使用非ASCII字符甚至更好:$。/ mysql2sqlite.sh --default-character-set = utf8 -hHost -uUser -pPass db | sqlite3 db.sqlite gist.github.com/esperlu/943776#gistcomment-984448
Sun

52

转换器列表。(今天位于archive.today的快照


一种即使在Windows上也可以使用但很少被提及的替代方法是:使用ORM类为您抽象特定的数据库差异。例如,您可以通过PHP(RedBean),Python(Django的ORM层,StormSqlAlchemy),Ruby on Rails(ActiveRecord),可可(CoreData)等获得这些。

即你可以这样做:

  1. 使用ORM类从源数据库加载数据。
  2. 将数据存储在内存中或序列化到磁盘。
  3. 使用ORM类将数据存储到目标数据库中。

43

Sequel(Ruby ORM)具有用于处理数据库的命令行工具,您必须安装ruby,然后:

  $ gem install sequel mysql2 sqlite3 
  $ sequel mysql2://user:password@host/database -C sqlite://db.sqlite

1
不要忘了gem install mysqlgem install sqlite3
尼克

1
gem install pg如果你从或向一个Postgres数据库要转换,续集应该有大分贝的适配器
马卡里奥

2
更换mysqlmysql2,如果您使用的是mysql2
Carlosin

1
注意:您将需要该ruby-dev软件包来构建这些本地gem软件包。
2014年

1
不得不使用“ gem安装后继mysql2 sqlite3”,然后使用“后继mysql2:// user:password @ host / database -C sqlite://db.sqlite”进行完美处理
unom 2014年

17

并非每个数据库模式都可以转换。MySQL比SQLite更复杂,功能更丰富。但是,如果您的架构足够简单,则可以将其转储到SQL文件中,然后尝试将其导入/加载到SQLite数据库中。


将MySQL数据库转储到文件后,可以使用此脚本将其转换为SQLite github.com/dumblob/mysql2sqlite(如@David_LeBauer的回答中所述)。
Paul Rougieux

7

大约2天前,当我不得不将20GB以上的MySQL数据库转换为SQLite时,我遇到了同样的问题。这绝非易事,我最终编写了完成任务的Python包

用Python编写的好处在于,它是跨平台的(不同于shell / bash脚本),并且可以使用pip install(即使在Windows上)也可以轻松安装。它使用生成器和正在处理的数据的分块,因此具有很高的内存效率。

我还付出了一些努力,以将大多数数据类型从MySQL正确转换为SQLite

该工具还经过了全面测试,可在Python 2.7和3.5+上运行

它可以通过命令行调用,但也可以用作标准Python类,您可以将其包含在较大的Python编排中。

使用方法如下:

Usage: mysql2sqlite [OPTIONS]

Options:
  -f, --sqlite-file PATH     SQLite3 database file  [required]
  -d, --mysql-database TEXT  MySQL database name  [required]
  -u, --mysql-user TEXT      MySQL user  [required]
  -p, --mysql-password TEXT  MySQL password
  -h, --mysql-host TEXT      MySQL host. Defaults to localhost.
  -P, --mysql-port INTEGER   MySQL port. Defaults to 3306.
  -c, --chunk INTEGER        Chunk reading/writing SQL records
  -l, --log-file PATH        Log file
  -V, --vacuum               Use the VACUUM command to rebuild the SQLite
                             database file, repacking it into a minimal amount
                             of disk space
  --use-buffered-cursors     Use MySQLCursorBuffered for reading the MySQL
                             database. This can be useful in situations where
                             multiple queries, with small result sets, need to
                             be combined or computed with each other.
  --help                     Show this message and exit.

1
嘿@techouse,看起来很棒!有什么办法可以处理.sql转储文件,或者是否需要连接到已安装的MySQL数据库?
vortek

嘿! 嗯,不,这需要一个有效的MySQL数据库。如果你有一个转储没有实际的服务器你最好的赌注是手动更改文件,如果你知道自己在做什么。
KlemenTušar19年

@arkadianriver我建议您始终将虚拟环境与Python配合使用
KlemenTušar,


4

将MySql DB转换为Sqlite的最简单方法:

1)为您的MySql数据库生成sql转储文件。

2)在此处将文件上传到RebaseData在线转换器

3)一个下载按钮将出现在页面上,以Sqlite格式下载数据库


4

我找到了完美的解决方案

首先,您需要以下脚本(将其放入名为“ mysql-to-sqlite.sh”的文件中):

#!/bin/bash
if [ "x$1" == "x" ]; then
  echo "Usage: $0 <dumpname>"
  exit
fi

cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
  $a=$1;
  s/\\'\''/'\'\''/g;
  s/\\n/\n/g;
  s/\),\(/\);\n$a\(/g;
}
' > $1.sql
cat $1.sql | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
else
  echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi

然后,转储数据库的副本:

you@prompt:~$ mysqldump -u root -p --compatible=ansi --skip-opt generator > dumpfile

现在,运行转换:

you@prompt:~$ mysql-to-sqlite.sh dumpfile

如果一切顺利,您现在应该拥有可以通过sqlite3使用的dumpfile.db。

you@prompt:~$ sqlite3 dumpfile.db 
SQLite version 3.6.10
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
dg_cities                 dg_forms                  dg_surnames             
dg_counties               dg_provinces              dg_user_accounts        
dg_countries              dg_provinces_netherlands
dg_first_names            dg_states

3

有不同的方法可以做到这一点。我也遇到了这个问题,我进行了很多搜索,然后找到了将MySQL转换为SQLite的简单方法。

跟着这些步骤:

  1. 首先,您需要安装SQLite DB浏览器(非常小巧,可以快速查看表和数据)

  2. 在记事本中打开您的MySQL文件,如果在记事本中打开++,那会很棒

  3. 删除包含信息或查询的前几行,然后保存。

  4. 打开SQLite DB浏览器,创建数据库,然后打开表,并选择与MySQL数据库中相同的类型。

  5. 在SQLite DB浏览器的菜单栏中,选择File->,然后导入保存的MySQL数据库文件。

警告对话框后,它将轻松转换为SQLite。

如果出错,则删除更多多余的行(如果您的MySQL文件具有)。

您也可以根据试用版将MySQL安装到SQLite Converter Software,但是我提供的转换信息是生命周期。


如果您的数据没有撇号这样的字符,则此方法效果很好。例如,sql dumb中的“这是彼得的书”将是“这是彼得的书”。这将使DB Browser抛出错误,对于大数据很难删除。但是,如果您将数据从phpAdmin作为CSV导入到DB Browser,则该导入将成功。希望对您有所帮助
Seunope

1

对于运行Mac的该问题,我的解决方案是

  1. 安装Ruby和续集,类似于Macario的答案。我点击了此链接,以帮助设置Mac OSX的 Ruby,mysql和sqlite3 Ruby on Rails开发设置
  2. 安装续集

    $ gem install sequel

    如果仍然需要

    % gem install mysql sqlite3

    然后使用以下基于Sequel doc bin_sequel.rdoc的文档(请参见复制数据库)

    sequel -C mysql://myUserName:myPassword@host/databaseName sqlite://myConvertedDatabaseName.sqlite

一个窗口用户可以安装Ruby和Sequel为Windows的解决方案。


我如何只从数据库而不是整个mysql数据库复制一个表?
Atul Vaibhav

对于过去的单个表,我已经做到了,但是可能有更好的方法。将表导出为csv,并选中第一行选项中的列名。然后,使用用于SQLite的数据库浏览器,使用来自csv的导入表选项将表导入到我现有的sqlite数据库中。然后,您可能必须进入并将字段更改为所需的类型,因为我相信所有字段都将设置为TEXT。在我正在从事的项目中,尽管我们开发了一个过程,但我们进行了api调用以返回表中的所有数据,然后将数据插入/替换到apps数据库中。
Grant Luck 2016年

它似乎正在工作。但是,我找不到输出文件在哪里。你能帮助我吗?
Pontios '18

1

我在此线程上尝试了多种方法,但对我没有任何帮助。所以这是一个新的解决方案,我也发现它很简单:

  1. 安装RazorSQL。适用于Mac,Windows和Linux。
  2. 在RazorSQL中,例如,在localhost上连接到数据库。转换不适用于sql转储文件。
  3. 右键单击数据库->数据库转换->选择SQLite。这将保存一个txt文件,其中包含sqlite创建此数据库所需的所有查询。
  4. 安装一个SQLite数据库管理器,例如DB Browser for SQLite。它适用于任何操作系统。
  5. 创建一个空数据库,转到“执行SQL”选项卡,然后粘贴步骤3中的内容。

就这样,现在您有了SQLite数据库。


RazorSQL似乎只是用表定义和数据插入功能构建一个“公用” * .sql文件,但没有特别针对SQLite的内容。它没有导出Views,这是一个很大的缺点。MySql附带的mysqldump客户端也可以导出视图,但是它也会产生很多条件的东西,等等SQLite不会消化。
dalilander

0

如果您有经验,请使用Perl \ Python \ etc编写简单的脚本,然后将MySQL转换为SQLite。从Mysql读取数据并将其写入SQLite。


0

我喜欢Jfly建议的SQLite2009 Pro Enterprise Manager。然而:

  • MySQL数据类型INT不会转换为SQlite数据类型INTEGER(与DBeaver一起使用)

  • 它不从MySQL导入外键约束(我找不到任何支持将外键约束从MySQL转移到SQlite的工具。)



0

如果为您提供了数据库文件,但尚未安装正确的服务器(SQLite或MySQL),请尝试以下工具:https : //dbconvert.com/sqlite/mysql/试用版允许转换每个表的前50条记录,其余数据带有水印。这是Windows程序,可以转储到正在运行的数据库服务器中,也可以将输出转储到.sql文件中。

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.