Быстрый простой способ переместить SQLite3 в MySQL?

Улучшите решение RouMao, временно отключив проверку GIT / curl ssl в Windows cmd:

set GIT_SSL_NO_VERIFY=true
git config --global http.proxy http://<your-proxy>:443

Преимущество этого решения в том, что оно действует только в текущем окне cmd.

216
задан Stephen Cox 20 August 2008 в 08:49
поделиться

4 ответа

Вот сценарий python, созданный на основе ответа Шалманеса и помощи Алекса Мартелли в Перевод Perl на Python

Я делаю это вики сообщества, так что пожалуйста можно редактировать и проводить рефакторинг, если это не нарушает функциональность (к счастью, мы можем просто откатиться) - это довольно некрасиво, но работает

, используйте так (при условии, что сценарий называется dump_for_mysql.py :

sqlite3 sample.db .dump | python dump_for_mysql.py > dump.sql

Который затем можно импортировать в mysql

примечание - вам нужно добавить ограничения внешнего ключа вручную, поскольку sqlite фактически не поддерживает их

вот сценарий:

#!/usr/bin/env python

import re
import fileinput

def this_line_is_useless(line):
    useless_es = [
        'BEGIN TRANSACTION',
        'COMMIT',
        'sqlite_sequence',
        'CREATE UNIQUE INDEX',
        'PRAGMA foreign_keys=OFF',
    ]
    for useless in useless_es:
        if re.search(useless, line):
            return True

def has_primary_key(line):
    return bool(re.search(r'PRIMARY KEY', line))

searching_for_end = False
for line in fileinput.input():
    if this_line_is_useless(line):
        continue

    # this line was necessary because '');
    # would be converted to \'); which isn't appropriate
    if re.match(r".*, ''\);", line):
        line = re.sub(r"''\);", r'``);', line)

    if re.match(r'^CREATE TABLE.*', line):
        searching_for_end = True

    m = re.search('CREATE TABLE "?(\w*)"?(.*)', line)
    if m:
        name, sub = m.groups()
        line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS `%(name)s`%(sub)s\n"
        line = line % dict(name=name, sub=sub)
    else:
        m = re.search('INSERT INTO "(\w*)"(.*)', line)
        if m:
            line = 'INSERT INTO %s%s\n' % m.groups()
            line = line.replace('"', r'\"')
            line = line.replace('"', "'")
    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')

    # Add auto_increment if it is not there since sqlite auto_increments ALL
    # primary keys
    if searching_for_end:
        if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line):
            line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT")
        # replace " and ' with ` because mysql doesn't like quotes in CREATE commands 
        if line.find('DEFAULT') == -1:
            line = line.replace(r'"', r'`').replace(r"'", r'`')
        else:
            parts = line.split('DEFAULT')
            parts[0] = parts[0].replace(r'"', r'`').replace(r"'", r'`')
            line = 'DEFAULT'.join(parts)

    # And now we convert it back (see above)
    if re.match(r".*, ``\);", line):
        line = re.sub(r'``\);', r"'');", line)

    if searching_for_end and re.match(r'.*\);', line):
        searching_for_end = False

    if re.match(r"CREATE INDEX", line):
        line = re.sub('"', '`', line)

    if re.match(r"AUTOINCREMENT", line):
        line = re.sub("AUTOINCREMENT", "AUTO_INCREMENT", line)

    print line,
48
ответ дан 23 November 2019 в 04:19
поделиться

Я использую загрузчик данных для переноса практически любых данных он помогает мне конвертировать MSSQL в MYSQL, доступ MS к MSSQL, mysql, загрузчик csv, foxpro и MSSQL к доступу MS, MYSQl, CSV, foxpro и т. д. На мой взгляд, это лучший инструмент переноса данных

Скачать бесплатно: http://www.dbload.com

2
ответ дан 23 November 2019 в 04:19
поделиться

BBOM, с которыми я столкнулся, обычно создавались органически, в дарвиновском процессе. Это звучит примерно так:

  1. Изначально система создана (не спроектирована) и плохо документирована.

  2. Исходные ресурсы продолжают создавать еще больший хаос в других местах, поэтому нет даже устной истории для этого «наследия». system.

  3. Приносится свежая кровь. Эти разработчики пытаются раскрыть работу различных частей системы, но это как несколько слепых, пытающихся понять слона, когда один схватился за хвост, один за ногу, а другой за хобот. Они вносят изменения, но никогда не чувствуют себя уверенно в них.

  4. Таким образом, система «развивается» слепым естественным отбором, но параллельно с этим идет эволюция наиболее трудноразрешимых,

0
ответ дан 23 November 2019 в 04:19
поделиться

Ха ... Хотел бы я найти это первым! Мой ответ был на этот пост ... сценарий для преобразования файла sql дампа mysql в формат, который можно импортировать в sqlite3 db

Объединение этих двух было бы именно тем, что мне было нужно:


Когда база данных sqlite3 собирается для использования с рубином вы можете изменить:

tinyint([0-9]*) 

на:

sed 's/ tinyint(1*) / boolean/g ' |
sed 's/ tinyint([0|2-9]*) / integer /g' |

увы, это работает только наполовину, потому что даже если вы вставляете единицы и нули в поле, помеченное как логическое, sqlite3 сохраняет их как единицы и нули, так что у вас есть пройти и сделать что-то вроде:

Table.find(:all, :conditions => {:column => 1 }).each { |t| t.column = true }.each(&:save)
Table.find(:all, :conditions => {:column => 0 }).each { |t| t.column = false}.each(&:save)

, но было полезно иметь файл sql, чтобы найти все логические значения.

1
ответ дан 23 November 2019 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: