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

この記事では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 AUTOINCREMENT NOT NULL,

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

KEYを削除

sqliteはdumpファイルのKEYでは

table “image” has more than one primary key

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

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,
  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` 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`)
) 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);
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

目次