MySQLのdumpデータをSQLite3にインポートする

よくコードに関するお問い合わせを頂くので、webエンジニアに人気のslackでゆるコミュを作りました。
コードに関する質問はゆるコミュでお願いします。ゆるコミュの参加・質問は無料です。

HTML / css / laravel / Django / wordpress / shopify / php / python / javascript / jQuery / React / AWS など初心者から中級者の質問を中心にお答え致します。

メンターとしての参加も大歓迎です。

この記事ではmysqldumpファイルをsqlite3にインポートする方法をご紹介します。

データベースからmysqldumpをしたデータベース管理アプリケーションはSequel Ace、sqliteはTablePlusを使用してインポートしました。

Sequel Aceを使用して出力したデータは次の通りです。
このままではsqliteが対応していない構文があるのでsqliteにインポートできないので、編集する必要があります。

# ************************************************************
# Sequel Ace SQL dump
# バージョン 20033
#
# https://sequel-ace.com/
# https://github.com/Sequel-Ace/Sequel-Ace
#
# ホスト: ... (MySQL 5.7.33-log)
# データベース: ...
# 生成時間: 2022-06-03 02:07:10 +0000
# ************************************************************


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# テーブルのダンプ image
# ------------------------------------------------------------

DROP TABLE IF EXISTS `image`;

CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

LOCK TABLES `image` WRITE;
/*!40000 ALTER TABLE `image` DISABLE KEYS */;

INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
	(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/image.png',146);

/*!40000 ALTER TABLE `image` ENABLE KEYS */;
UNLOCK TABLES;



/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

sqliteにインポートできるように、このdumpファイルを編集したファイルは次の通りです。

DROP TABLE IF EXISTS `image`;

CREATE TABLE `image` (
  `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);


INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
	(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/image.png',146);

sqliteにインポートさせるためにdumpファイルを編集する部分は以下の通りです。

  • コメントアウトをすべて削除
  • SET NAMES utf8mb4;を削除
  • LOCK TABLESをすべて削除
  • idをINTEGER PRIMARY KEY AUTOINCREMENT NOT NULLに変更
  • KEYを削除
  • ENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除

一つ一つ説明します。

目次

コメントアウトをすべて削除

コメントアウトがあると

unrecognized token: “#”

というエラーが出るので、# .../* ... */で囲われたコメントアウトはすべて削除します。

ダンプファイルにあるコメントアウトはこれらです。これらはすべて不要なので削除します。

# ************************************************************
# Sequel Ace SQL dump
# バージョン 20033
#
# https://sequel-ace.com/
# https://github.com/Sequel-Ace/Sequel-Ace
#
# ホスト: ... (MySQL 5.7.33-log)
# データベース: ...
# 生成時間: 2022-06-03 02:07:10 +0000
# ************************************************************


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# テーブルのダンプ image
# ------------------------------------------------------------
...
/*!40000 ALTER TABLE `image` DISABLE KEYS */;

...

/*!40000 ALTER TABLE `image` ENABLE KEYS */;
...



/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

SET NAMES utf8mb4;を削除

sqliteはSETに対応していないので、

near “SET”: syntax error

がでます。

なので、SET NAMES utf8mb4;を削除します。

SET NAMES utf8mb4;

DROP TABLE IF EXISTS `image`;

CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

LOCK TABLES `image` WRITE;

INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
	(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/imagemys.png',146);

UNLOCK TABLES;

LOCK TABLESをすべて削除

sqliteはLOCKにも対応していないので、

near “LOCK”: syntax error

のエラーが出ます。

なので、LOCK TABLES image WRITE;UNLOCK TABLES;を削除します。

DROP TABLE IF EXISTS `image`;

CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

LOCK TABLES `image` WRITE;

INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
	(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/imagemys.png',146);

UNLOCK TABLES;

idをINTEGER PRIMARY KEY AUTOINCREMENT NOT NULLに変更

sqliteはdumpファイルのAUTO_INCREMENTでは

near “AUTO_INCREMENT”: syntax error

というエラーがでます。

DROP TABLE IF EXISTS `image`;

CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
	(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/imagemys.png',146);

そのため、idは以下のように変更する必要があります。

`id` int(11) NOT NULL AUTO_INCREMENT,
↓
`id` INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,

AUTO_INCREMENTを削除するだけでも大丈夫ですが、データを保存するときにidは自動採番にならないので思いもよらないエラーになる可能性があります。

KEYを削除

sqliteはdumpファイルのKEYでは

table “image” has more than one primary key

のエラーが出るのでKEYを作書します。

CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `image_user_id_9168ff31_fk_user_id` (`user_id`),
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

また、今回のdumpファイルにはありませんが、UNIQUE KEY `email` (`email`),という書き方もエラーになります。

ENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除

sqlieはENGINE=InnoDB DEFAULT CHARSET=utf8mb4に対応していないので

near “ENGINE”: syntax error

のエラーが出ます。

そのためENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除します。

CREATE TABLE `image` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

まとめ

mysqlのdumpファイルをsqliteにインポートさせるために次のように編集する必要があります。

  • コメントアウトをすべて削除
  • SET NAMES utf8mb4;を削除
  • LOCK TABLESをすべて削除
  • idをINTEGER PRIMARY KEY AUTOINCREMENT NOT NULLに変更
  • KEYを削除
  • ENGINE=InnoDB DEFAULT CHARSET=utf8mb4を削除

編集後のdumpファイルは以下の通りです。

DROP TABLE IF EXISTS `image`;

CREATE TABLE `image` (
  `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  `deleted_at` datetime(6) DEFAULT NULL,
  `title` varchar(150) DEFAULT NULL,
  `path` varchar(100) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  CONSTRAINT `image_user_id_9168ff31_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);


INSERT INTO `image` (`id`, `created_at`, `updated_at`, `deleted_at`, `title`, `path`, `user_id`)
VALUES
	(1,'2021-04-28 02:45:13.088089','2021-04-28 02:45:13.088129',NULL,NULL,'uploads/2021/04/image.png',146);

よくコードに関するお問い合わせを頂くので、webエンジニアに人気のslackでゆるコミュを作りました。
コードに関する質問はゆるコミュでお願いします。ゆるコミュの参加・質問は無料です。

HTML / css / laravel / Django / wordpress / shopify / php / python / javascript / jQuery / React / AWS など初心者から中級者の質問を中心にお答え致します。

メンターとしての参加も大歓迎です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

エンジニアを目指す方必見!おすすめプログラミングスクール

最短でエンジニアになるには、いかに効率よく学習するかが重要です。モチベーションを維持しながら最短でエンジニアを目指すならプログラミングスクールを利用するのもおすすめです。

コメント

コメントする

目次
閉じる