MySQLデータベースをSQLiteデータベースにエクスポートする


80

MySQLデータベースをSQLiteデータベースにエクスポートするのを手伝ってください。


2
SQLiteプロジェクトには、変換ユーティリティに関するページもあります。sqlite.org
Clinton

@Clintonリンク先のページに、情報が廃止されたという警告があります。
kjones 2017

回答:


71

MysqlをSqlite3ファイルに変換する素晴らしいLinuxシェルスクリプトがGithubにあります。サーバーにmysqldumpとsqlite3の両方をインストールする必要があります。よく働く。


これまでのところ最もよく機能します!sqliteが理解できないエンコーディングの「COLLATExy」ステートメントを削除するだけで済みます。ローカル開発用にmysqlデータベースのクローンが必要な場合は、サーバーにsqlite3は必要ないことに注意してください。
benzkji 2014年

1
残念ながら私にはうまくいきませんでした。下記の「PRIMARYKEY」ステートメントの問題とは別に、「INSERT」ステートメントと欠落しているテーブル(「オブジェクト」)に関連する他の多くのエラーが報告されました。
BartoszKP 2015

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.
Li-aung Yip 2016

1
headsupilyaigpetrovと@ Li-aungYipに感謝します。リンクを更新しました
georgiecasey 2016年

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 2016

SQLファイルが1GBより大きい場合は、最初に分割してください。それ以外の場合、perlスクリプトは置換ループエラーを出します。
nurp

3

一番上の投稿で言及されているmysql2sqlite.shは、PRIMARY KEY行をうまく処理できず)、CREATEステートメントを完了するための末尾を記述しません。

これが私がしたことです。私はmysqlダンプを次のように実行しました:

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

次に、grepを使用してPRIMARYKEYとKEYを削除しました。

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

次に、エディターを使用してファイルを修正しました。キーを削除すると、次のようなCREATEステートメントが作成されます。

CREATE ...
  ...,
)

その末尾,を削除する必要があります。viでは、この式はそれらと一致します、$ \ n)

次に、すべて\'をに変更する必要があります''

次に、インポートを実行できます。

sqlite3 local.sqlite3 < localdb.txt.1

以上です。自分に合ったプログラムは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

2つのデータベースで異なるapexエンコーディングを修正するためにsedを使用する必要がありました


これに感謝します。元の質問では、作成スキーマを含める必要があるかどうかが指定されていなかったため、役に立ちました。スキーマがすでにセットアップされている場合はより簡単
kjones 2017

0

個人的には、mysqldumpの簡単な使用法が好きですが、いくつかの調整が必要です(Unixでのアートと何をしたいかによって異なります)。

例 PKを使用する1つのテーブル(製品)の場合:

$ 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ですでに説明した素晴らしいawkLinuxシェルスクリプトを使用することをお勧めします 。


-1

SQLiteデータベースを作成および編集できるSQLiteデータベースブラウザと呼ばれる素晴らしい軽量ツールがあります。これを使用して、Androidアプリのデータベースを作成しました。それに対してSQLステートメントを実行してデータをロードできるため、mySQLデータベースからデータをエクスポートする場合は、このツールを使用してデータをインポートできます。リンクは次のとおりです:http//sqlitebrowser.sourceforge.net/


2
これはMySQL変換にどのように役立ちますか?
CL。

2
それはあなたがする必要があることを正確に行うのに役立ちます。実際、私は文字通り今これをやっています。mysqldumpまたはphpMyAdminを使用してMySQLをエクスポートしてから、上記のツールを使用してsqliteデータベースにインポートします。彼は「MySQLデータベースをSQLiteデータベースにエクスポートする」ことを求めました。上記のツールは、必要なことを正確に実行するための2番目のステップになります。正当な援助に反対票を投じることは、まったく間違っています。私はここで新しく、私の答えは質問に対処するだけでなく、実際の状況で現在使用しているものです。理由もなくすぐに反対票を投じて、人々が参加するのを思いとどまらせないでください。
アーロンラトナー2013年

2
実際の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
これは実際には、sqliteではなくmysqlで利用可能な違いと機能で機能しますか?
rzetterberg

5
これは機能しません。インデックス、テーブルの説明、バイナリデータのエスケープシーケンス、ロックメカニズム、おそらく他のものはすべて、MySQLとSQLiteで異なります。
CR。

これははるかに優れたソリューションです:stackoverflow.com/questions/455606/…–
ジョセフ

4
これは機能しません。最初に頭に浮かんだことを投稿する前に、ソリューションをテストしてください...
Maciej Jankowski 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.