Експортуйте базу даних MySQL у базу даних SQLite


80

Будь ласка, допоможіть мені з експортом бази даних MySQL у базу даних SQLite.


2
У проекті SQLite також є сторінка про утиліти перетворення: sqlite.org/cvstrac/wiki?p=ConverterTools
— Клінтон,

@Clinton на сторінці, на яку ви посилаєтесь, є попередження про те, що інформація застаріла.
— kjones

Відповіді:


71

На Github є фантастичний сценарій оболонки Linux, який перетворює Mysql у файл Sqlite3. Вам потрібні як mysqldump, так і sqlite3, встановлені на вашому сервері. Чудово працює.


працює найкраще поки що! потрібно лише видалити деякі оператори "COLLATE xy" з кодуваннями, які sqlite не розуміє. Зверніть увагу, що вам не потрібен sqlite3 на вашому сервері, якщо ви хочете клон бази даних MySQL для локальної розробки.
— benzkji

1
На жаль, у мене не вийшло. Окрім згаданих нижче проблем із операторами "PRIMARY KEY", повідомлялося про багато інших помилок, пов'язаних із операторами "INSERT" та відсутніми таблицями ("об'єктами").
— BartoszKP

2
Автор відмовився від сценарію, але робота продовжувалась у цій форці
— 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

1
дякую за headsup ilyaigpetrov та @ Li-aungYip, я оновив посилання
— georgiecasey

7

Відповідь @ user2111698 під редакцією @quassy працює, як і обіцяно. Оскільки я часто це роблю, я вкладаю їхні інструкції в скрипт 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

Радий; не швидко зрозумійте, як
— Джордж Фішер

1
Якщо ви видалите коментарі, ви закінчите з вертикальним прокручуванням (додайте будь-які коментарі, які ви вважаєте важливими, до тексту вашої відповіді). Вертикальну прокрутку можна обробляти зворотною рискою косою чергою.
— zhon

якщо ваш файл sql перевищує 1 Гб, спочатку розділіть його. інакше скрипт 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 для видалення ОСНОВНОГО КЛЮЧУ та КЛЮЧУ:

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 та того, що ви хочете зробити).

Напр. лише для однієї таблиці (prods) з ​​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")
    );

Для більш складних речей, мабуть, краще написати обгортку, або тоді скористатися вже згаданим фантастичним сценарієм оболонки Linux на Gist .


-1

Існує фантастичний, легкий інструмент під назвою SQLite Database Browser, який дозволяє створювати та редагувати бази даних sqlite. Я використовував його для створення баз даних для програм для Android. Ви можете запустити проти нього оператори SQL для завантаження даних, тому, якщо ви експортуєте дані з бази даних MySQL, ви можете просто імпортувати їх за допомогою цього інструменту. Ось посилання: http://sqlitebrowser.sourceforge.net/


2
Як це допомагає з перетворенням MySQL?
— ЗР.

2
Це допоможе вам зробити саме те, що вам потрібно зробити. Насправді я буквально роблю це зараз. Експортуйте MySQL за допомогою mysqldump або phpMyAdmin, а потім скористайтеся наведеним вище інструментом, щоб імпортувати його в базу даних sqlite. Він попросив "з експортом бази даних MySQL у базу даних SQLite", а наведений вище інструмент стане другим кроком у виконанні саме того, що вам потрібно. Голосувати проти законної допомоги просто так неправильно. Я тут новачок, і моя відповідь стосується не лише питання, але і того, що я використовую зараз у реальній ситуації. Не поспішайте голосувати без причини і не відмовляйте людям брати участь.
— Аарон Ратнер,

2
Ви пропустили фактичний другий (і найважливіший) крок, перетворивши всі специфічні для MySQL частини дампа MySQL у специфічний для SQLite або стандартний синтаксис.
— ЗР.

4
Пізно, але цей інструмент не працює для цієї проблеми. Він не підтримує специфічний для MySQL синтаксис (лише синтаксис SQLite). Вам доведеться досить сильно відредагувати файл дампа, щоб його було успішно імпортовано.
— Sverri M. Olsen

5
@AaronRatner Ні, рішення не працює. Питання чітко задає питання перетворення бази даних MySQL, а інструмент, який ви рекомендуєте, не обробляє синтаксис MySQL. Вам не потрібно сприймати це особисто - з того, що ви говорите, я здогадуюсь, що саме вам потрібно "розслабитися" :-) Якщо хтось каже, що ваше рішення їм не корисне, вони просто заявляють простий факт. Ваша відповідь, що це "надзвичайно важко, оскільки рішення є корисним", є абсурдною. Я знаю, що це не корисно для мене, бо це не так :-) Вітаю!
— BartoszKP

-17

експортувати дані за допомогою

  mysqldump database > database.sql

та імпортуйте дані за допомогою

  sqlite3 database < database.sql

Вам можуть знадобитися параметри -u (користувач) та -p (пароль)


9
Чи справді це спрацює з відмінностями та функціями, доступними в mysql, а не в sqlite?
— rzetterberg

5
Це не спрацює. Індекси, описи таблиць, послідовності бінарних даних, механізми блокування, ймовірно, інші речі, різні між MySQL та SQLite.
— CR.

Це набагато краще рішення: stackoverflow.com/questions/455606/…
— Джозеф

4
це не спрацює. Будь ласка, протестуйте рішення, перш ніж розміщувати все, що вам спаде на думку ...
— Мацей Янковський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.