Кто-нибудь знает быстрый и простой способ переноса базы данных SQLite3 в MySQL?
Вот список конвертеров (не обновляется с 2011 года):
то есть вы могли бы сделать это:
Кажется, все начинают с нескольких выражений grep и perl, и вы вроде бы получаете что-то, что работает для вашего конкретного набора данных, но вы не представляете, правильно ли он импортировал данные или нет. Я серьезно удивлен, что никто не создал надежную библиотеку, которая может конвертировать между ними.
Вот список ВСЕХ различий в синтаксисе SQL, о которых я знаю между двумя форматами файлов: Строки, начинающиеся с:
не используются в MySQL
CREATE TABLE/INSERT INTO "table_name"
и MySQL используетCREATE TABLE/INSERT INTO table_name
INSERT INTO
предложенийINSERT INTO
предложений't'
и 'f'
для логических значений, MySQL использует 1
и 0
(простое регулярное выражение для этого может потерпеть неудачу, если у вас есть строка типа: «Я делаю, вы не 'внутри» INSERT INTO
)AUTOINCREMENT
, MySQL используетAUTO_INCREMENT
Вот очень простой взломанный скрипт на Perl, который работает для моего набора данных и проверяет многие из этих условий, которые встречаются в других скриптах на Perl, которые я нашел в сети. Мы гарантируем, что это сработает для ваших данных, но вы можете изменить их и опубликовать здесь.
#! /usr/bin/perl
while ($line = <>){
if (($line !~ /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
$name = $1;
$sub = $2;
$sub =~ s/\"//g;
$line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
}
elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
$line = "INSERT INTO $1$2\n";
$line =~ s/\"/\\\"/g;
$line =~ s/\"/\'/g;
}else{
$line =~ s/\'\'/\\\'/g;
}
$line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
$line =~ s/THIS_IS_TRUE/1/g;
$line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
$line =~ s/THIS_IS_FALSE/0/g;
$line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
print $line;
}
}
&& ($line !~ /CREATE UNIQUE INDEX/)
добавления&& ($line !~ /PRAGMA foreign_keys=OFF/)
* регулярное выражение для сопоставления имен таблиц пропускает цифры, то есть вместо$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/
этого должен быть$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/
Надеюсь, что это поможет будущему читателиВот скрипт на python, построенный на ответе Шалманеса и некоторой помощи Алекса Мартелли в переводе Perl на Python
Я делаю это вики-сообществом, поэтому, пожалуйста, не стесняйтесь редактировать и рефакторинг, если он не нарушает функциональность (к счастью, мы можем просто откатиться) - Это довольно уродливо, но работает
использовать так (при условии, что скрипт называется
dump_for_mysql.py
:Который вы можете затем импортировать в MySQL
примечание - вам нужно добавить ограничения внешнего ключа вручную, так как sqlite фактически не поддерживает их
вот сценарий:
источник
schema_migrations
(version
varchar (255) NOT NULL); INSERT INTO schema_migrations VALUES (20100714032840
); INSERT INTO schema_migrations VALUES ('20100714033251'); ___Blobvar
тип данных, обратные тики в операторе CREATE ...Вероятно, самый простой способ - использовать команду sqlite .dump, в этом случае создайте дамп образца базы данных.
Затем вы можете (теоретически) импортировать это в базу данных mysql, в данном случае тестовую базу данных на сервере базы данных 127.0.0.1, используя пользователя root.
Я говорю в теории, поскольку есть несколько различий между грамматиками.
В sqlite начинаются транзакции
MySQL использует только
Есть другие подобные проблемы (всплывают varchars и двойные кавычки), но ничего найти и заменить не удалось исправить.
Возможно, вам следует спросить, почему вы мигрируете, если проблема в производительности / размере базы данных, возможно, стоит взглянуть на переопределение схемы, если система переходит на более мощный продукт, это может быть идеальным временем для планирования будущего ваших данных.
источник
Если вы используете Python / Django, это довольно просто:
создайте две базы данных в settings.py (как здесь https://docs.djangoproject.com/en/1.11/topics/db/multi-db/ )
тогда просто сделайте так:
источник
источник
Я обычно использую функцию экспорта / импорта таблиц IntelliJ DataGrip .
Вы можете увидеть прогресс в правом нижнем углу.
[ ]
источник
Я только что прошел этот процесс, и в этом Q / A есть много очень хорошей помощи и информации, но я обнаружил, что мне нужно было собрать воедино различные элементы (плюс некоторые из других Q / As), чтобы получить рабочее решение в Чтобы успешно мигрировать.
Однако даже после объединения существующих ответов я обнаружил, что сценарий Python не работает для меня полностью, так как он не работает там, где в INSERT было несколько логических вхождений. Смотрите здесь, почему это так.
Итак, я решил опубликовать свой объединенный ответ здесь. Конечно, это заслуга тех, кто внес свой вклад в других местах. Но я хотел что-то вернуть и сэкономить время для других.
Я выложу сценарий ниже. Но во-первых, вот инструкция для преобразования ...
Я запустил скрипт на OS X 10.7.5 Lion. Python работал из коробки.
Чтобы сгенерировать входной файл MySQL из существующей базы данных SQLite3, запустите сценарий для своих файлов следующим образом:
Затем я скопировал полученный файл dumped_sql.sql в коробку Linux с Ubuntu 10.04.4 LTS, где должна была находиться моя база данных MySQL.
Другая проблема, с которой я столкнулся при импорте файла MySQL, заключалась в том, что некоторые символы Unicode UTF-8 (в частности, одинарные кавычки) импортировались некорректно, поэтому мне пришлось добавить переключатель в команду, чтобы указать UTF-8.
Результирующая команда для ввода данных в новую пустующую базу данных MySQL выглядит следующим образом:
Пусть готовят, и так и должно быть! Не забудьте внимательно изучить ваши данные до и после.
Так что, по требованию ОП, это легко и быстро, когда вы знаете, как! :-)
Кроме того, одна вещь, в которой я не был уверен, прежде чем изучать эту миграцию, заключалась в том, будут ли сохранены значения полей create_at и updated_at - для меня хорошая новость заключается в том, что они есть, поэтому я мог перенести свои существующие производственные данные.
Удачи!
ОБНОВИТЬ
С тех пор как я переключился, я заметил проблему, которую раньше не замечал. В моем приложении на Rails мои текстовые поля определены как «строка», и это распространяется на схему базы данных. Описанный здесь процесс приводит к тому, что они определяются как VARCHAR (255) в базе данных MySQL. Это накладывает ограничение на 255 символов для этих размеров полей - и все, что за этим было молча усечено во время импорта. Я считаю, что для поддержки длины текста, превышающей 255, в схеме MySQL нужно будет использовать 'TEXT', а не VARCHAR (255). Процесс, определенный здесь, не включает это преобразование.
Вот объединенный и переработанный скрипт Python, который работал для моих данных:
источник
Недавно мне пришлось перейти с MySQL на JavaDB для проекта, над которым работает наша команда. Я нашел библиотеку Java, написанную Apache под названием DdlUtils, которая сделала это довольно легко. Он предоставляет API, который позволяет вам делать следующее:
Инструменты, с которыми мы работали, не были полностью автоматизированы, но они работали довольно хорошо. Даже если ваше приложение не на Java, не должно быть слишком сложно собрать несколько небольших инструментов для одноразовой миграции. Я думаю, что я смог вытащить нашу миграцию с менее чем 150 строками кода.
источник
Нет необходимости ни в каком скрипте, команде и т.д ...
вам нужно только экспортировать базу данных sqlite в виде
.csv
файла, а затем импортировать ее в Mysql с помощью phpmyadmin.Я использовал его, и он работал потрясающе ...
источник
На основе решения Jims: быстрый и простой способ миграции SQLite3 на MySQL?
Это работает для меня. Я использую sed только для того, чтобы выбросить первую строку, которая не похожа на mysql, но вы также можете изменить скрипт dump.py, чтобы выбросить эту строку.
источник
Получить дамп SQL
Импортировать дамп в MySQL
Для небольшого импорта:
или
Это попросит вас ввести пароль. Обратите внимание: если вы хотите ввести свой пароль напрямую, вы должны сделать это без пробела, сразу после
-p
:Для больших отвалов:
mysqlimport или другие инструменты импорта, такие как BigDump .
BigDump дает вам индикатор выполнения:
источник
Ха ... Хотел бы я найти это первым! Мой ответ был на этот пост ... скрипт для конвертирования файла sql mysql dump в формат, который можно импортировать в sqlite3 db
Объединение двух было бы именно тем, что мне было нужно:
Когда база данных sqlite3 будет использоваться с ruby, вы можете изменить:
чтобы:
увы, это только половина работает, потому что даже если вы вставляете 1 и 0 в поле, помеченное как логическое, sqlite3 сохраняет их как 1 и 0, так что вам нужно пройти и сделать что-то вроде:
но было полезно иметь файл sql для просмотра, чтобы найти все логические значения.
источник
Я написал этот простой скрипт на Python3. Его можно использовать как включенный класс или автономный скрипт, вызываемый через терминальную оболочку. По умолчанию он импортирует все целые числа как
int(11)
и строки какvarchar(300)
, но все это можно настроить в аргументах конструктора или скрипта соответственно.ПРИМЕЧАНИЕ. Требуется MySQL, Connector / Python 2.0.4 или выше.
Вот ссылка на источник на GitHub, если вам трудно прочитать приведенный ниже код: https://github.com/techouse/sqlite3-to-mysql
источник
Этот сценарий в порядке, за исключением этого случая, который, конечно, я встречал:
Сценарий должен выдать такой вывод:
Но дает вместо этого вывод:
с некоторыми странными не-ascii символами вокруг последних 0 и 1.
Это больше не проявилось, когда я прокомментировал следующие строки кода (43-46), но появились другие проблемы:
Это просто особый случай, когда мы хотим добавить значение «f» или «t», но я не очень удобен с регулярными выражениями, я просто хотел, чтобы этот случай был кем-то исправлен.
В любом случае, большое спасибо за этот удобный скрипт !!!
источник
Это простое решение сработало для меня:
источник
следите за заявлениями CREATE
источник