Быстрый простой способ перенести SQLite3 на MySQL? - PullRequest
211 голосов
/ 20 августа 2008

Кто-нибудь знает быстрый и простой способ переноса базы данных SQLite3 в MySQL?

Ответы [ 26 ]

1 голос
/ 21 октября 2010

fallino правильно определил местонахождение ошибки в скрипте. У меня есть решение. Проблема заключается в следующих строках:

line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
line = line.replace('THIS_IS_TRUE', '1')
line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
line = line.replace('THIS_IS_FALSE', '0')

Шаблон замены (2-й параметр) в вызовах re.sub представляет собой «обычную» строку, поэтому вместо \ 1, расширяющегося до первого соответствия регулярному выражению, он расширяется до литерала 0x01. Аналогично, \ 2 расширяется до 0x02. Например, строка, содержащая: , 'Т', 'F', будет заменен на: <0x01> 10 <0x02>
(Первая замена изменяется, 't', на <0x1> 1 <0x2> Вторая замена заменяет <0x02> 'f' на <0x1> 0 <0x1>)

Исправление состоит в том, чтобы либо заменить замещающие строки, добавив префикс 'r', либо экранировать \ 1 и \ 2 в существующей строке. Поскольку для необработанных строк используются простые манипуляции со строками регулярного выражения, вот исправление, использующее их:

line = re.sub(r"([^'])'t'(.)", r"\1THIS_IS_TRUE\2", line)
line = line.replace('THIS_IS_TRUE', '1')
line = re.sub(r"([^'])'f'(.)", r"\1THIS_IS_FALSE\2", line)
line = line.replace('THIS_IS_FALSE', '0')
0 голосов
/ 30 сентября 2009

Этот сценарий в порядке, за исключением этого случая, который я, конечно, встречал:

INSERT INTO "requestcomparison_stopword" VALUES(149,'f');
INSERT INTO "requestcomparison_stopword" VALUES(420,'t');

Скрипт должен выдать такой вывод:

INSERT INTO requestcomparison_stopword VALUES(149,'f');
INSERT INTO requestcomparison_stopword VALUES(420,'t');

Но вместо этого выдает:

INSERT INTO requestcomparison_stopword VALUES(1490;
INSERT INTO requestcomparison_stopword VALUES(4201;

со странными не-ascii символами вокруг последних 0 и 1.

Это больше не показывалось, когда я комментировал следующие строки кода (43-46), но появились другие проблемы:

<code>
    line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
    line = line.replace('THIS_IS_TRUE', '1')
    line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
    line = line.replace('THIS_IS_FALSE', '0')

Это просто особый случай, когда мы хотим добавить значение 'f' или 't', но мне не очень удобно с регулярными выражениями, я просто хотел определить, что этот случай кем-то исправлен. 1018 *

В любом случае, большое спасибо за этот удобный скрипт !!!

0 голосов
/ 11 февраля 2016

Я взял скрипт Python из https://stackoverflow.com/a/32243979/746459 (выше) и исправил его, чтобы он соответствовал нашим собственным схемам sqlite. Было несколько проблем, с которыми пришлось столкнуться.

Вы можете найти его в системе контроля версий здесь: https://bitbucket.org/mjogltd/sqlite3mysql

Также доступно то же самое, что и изображение Docker, здесь: https://hub.docker.com/r/mjog/sqlite3mysql/ - оно полностью применимо даже под рабочим столом Windows.

0 голосов
/ 19 ноября 2015

Это простое решение сработало для меня:

<?php
$sq = new SQLite3( 'sqlite3.db' );

$tables = $sq->query( 'SELECT name FROM sqlite_master WHERE type="table"' );

while ( $table = $tables->fetchArray() ) {
    $table = current( $table );
    $result = $sq->query( sprintf( 'SELECT * FROM %s', $table ) );

    if ( strpos( $table, 'sqlite' ) !== false )
        continue;

    printf( "-- %s\n", $table );
    while ( $row = $result->fetchArray( SQLITE3_ASSOC ) ) {
        $values = array_map( function( $value ) {
            return sprintf( "'%s'", mysql_real_escape_string( $value ) );
        }, array_values( $row ) );
        printf( "INSERT INTO `%s` VALUES( %s );\n", $table, implode( ', ', $values ) );
    }
}
0 голосов
/ 17 февраля 2015

Я тщательно проверил все ответы в этом посте, а также ответы в другом связанном посте Перевод Perl в Python . И все же никто не смог полностью решить мою проблему.

Мой сценарий заключается в том, что мне нужно перенести базу данных Trac с sqlite на MySQL, и база данных содержит много технического вики-контента. Поэтому внутри значений INSERT INTO могут присутствовать операторы SQL, такие как CREATE TABLE и AUTOINCREMENT. Но у построчной замены там могут быть неправильные замены.

В конце концов я написал свой собственный инструмент для этой цели:

https://github.com/motherapp/sqlite_sql_parser

Использование относительно простое:

python parse_sqlite_sql.py export.sql

Будет создано два файла: export.sql.schema.sql и export.sql.data.sql. Один для обновленной схемы БД, а другой для обновленных данных БД.

Можно выполнить дальнейшие ручные изменения в файле схемы БД с помощью любого текстового редактора, не беспокоясь об изменении содержимого.

Надеюсь, что это поможет другим в будущем.

0 голосов
/ 09 апреля 2012
echo ".dump" | sqlite3 /tmp/db.sqlite > db.sql

следите за заявлениями CREATE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...