Експортуйте базу даних 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.