Alguém conhece uma maneira rápida e fácil de migrar um banco de dados SQLite3 para o MySQL?
Aqui está uma lista de conversores (não atualizados desde 2011):
ou seja, você pode fazer isso:
Todo mundo parece começar com algumas expressões greps e perl e você meio que obtém algo que funciona para o seu conjunto de dados específico, mas você não tem idéia se importou os dados corretamente ou não. Estou seriamente surpreso que ninguém tenha construído uma biblioteca sólida que possa ser convertida entre os dois.
Aqui está uma lista de TODAS as diferenças na sintaxe SQL que eu conheço entre os dois formatos de arquivo: As linhas começando com:
não são usados no MySQL
CREATE TABLE/INSERT INTO "table_name"
e MySQLCREATE TABLE/INSERT INTO table_name
INSERT INTO
cláusulasINSERT INTO
cláusulas't'
e 'f'
para booleanos, o MySQL usa 1
e 0
(um regex simples para isso pode falhar quando você tem uma string como: 'eu faço, você não' dentro da sua INSERT INTO
)AUTOINCREMENT
, MySQL usaAUTO_INCREMENT
Aqui está um script perl hackeado muito básico, que funciona para o meu conjunto de dados e verifica muito mais dessas condições que outros scripts perl que encontrei na web. A Nu garante que funcionará para seus dados, mas fique à vontade para modificar e postar aqui.
#! /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/)
adicionar&& ($line !~ /PRAGMA foreign_keys=OFF/)
* a regex de correspondência de nome de tabela perde dígitos, ou seja, em vez de$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/
deve haver$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/
Espero que isso ajude o futuro leitoresAqui está um script python, construído com base na resposta de Shalmanese e com alguma ajuda de Alex martelli em Traduzindo Perl para Python
Eu estou criando o wiki da comunidade, então fique à vontade para editar e refatorar, contanto que não quebre a funcionalidade (felizmente, podemos reverter) - É muito feio, mas funciona
utilização como assim (assumindo que o script é chamado
dump_for_mysql.py
:Que você pode importar para o mysql
note - você precisa adicionar restrições de chave estrangeira manualmente, pois o sqlite realmente não as suporta
aqui está o script:
fonte
schema_migrations
(version
varchar (255) NÃO NULL); INSERIR EM schema_migrations VALUES (20100714032840
); INSERIR EM schema_migrations VALUES ('20100714033251'); __Blobvar
tipo de dados, de volta carrapatos na instrução CREATE ...Provavelmente, a maneira mais rápida e fácil de usar o comando sqlite .dump, nesse caso, crie um despejo do banco de dados de amostra.
Você pode (em teoria) importar isso para o banco de dados mysql, nesse caso o banco de dados de teste no servidor de banco de dados 127.0.0.1, usando a raiz do usuário.
Eu digo em teoria, pois existem algumas diferenças entre gramáticas.
Nas transações sqlite começam
O MySQL usa apenas
Existem outros problemas semelhantes (varchars e aspas duplas voltam à mente), mas nada que encontrar e substituir não pôde resolver.
Talvez você deva perguntar por que está migrando, se o desempenho / tamanho do banco de dados é o problema, talvez tente reoginizar o esquema, se o sistema estiver migrando para um produto mais poderoso, esse pode ser o momento ideal para planejar o futuro de seus dados.
fonte
Se você estiver usando Python / Django, é muito fácil:
crie dois bancos de dados em settings.py (como aqui https://docs.djangoproject.com/en/1.11/topics/db/multi-db/ )
então faça assim:
fonte
fonte
Normalmente, uso o recurso Exportar / Importar Tabelas do IntelliJ DataGrip .
Você pode ver o progresso no canto inferior direito.
[ ]
fonte
Acabei de passar por esse processo e há muita ajuda e informações muito boas nesta Perguntas e Respostas, mas descobri que precisava reunir vários elementos (mais alguns de outras perguntas / respostas) para obter uma solução de trabalho. para migrar com sucesso.
No entanto, mesmo depois de combinar as respostas existentes, descobri que o script Python não funcionava totalmente para mim, pois não funcionava onde havia várias ocorrências booleanas em um INSERT. Veja aqui por que esse foi o caso.
Então, pensei em publicar minha resposta mesclada aqui. O crédito vai para aqueles que contribuíram em outros lugares, é claro. Mas eu queria devolver algo e poupar aos outros o tempo que se segue.
Vou postar o script abaixo. Mas, primeiro, aqui estão as instruções para uma conversão ...
Eu executei o script no OS X 10.7.5 Lion. Python trabalhou fora da caixa.
Para gerar o arquivo de entrada MySQL a partir do banco de dados SQLite3 existente, execute o script em seus próprios arquivos da seguinte maneira:
Em seguida, copiei o arquivo dumped_sql.sql resultante para uma caixa Linux executando o Ubuntu 10.04.4 LTS onde meu banco de dados MySQL deveria residir.
Outro problema que tive ao importar o arquivo MySQL foi que alguns caracteres UTF-8 unicode (especificamente aspas simples) não estavam sendo importados corretamente, então tive que adicionar uma opção ao comando para especificar UTF-8.
O comando resultante para inserir os dados em um novo banco de dados MySQL vazio é o seguinte:
Deixe cozinhar, e deve ser isso! Não se esqueça de examinar seus dados, antes e depois.
Portanto, como o OP solicitou, é rápido e fácil quando você sabe como! :-)
Além disso, uma coisa sobre a qual eu não tinha certeza antes de analisar essa migração era se os valores de campo created_at e updated_at seriam preservados - a boa notícia para mim é que eles são, para que eu pudesse migrar meus dados de produção existentes.
Boa sorte!
ATUALIZAR
Desde que fiz essa alteração, notei um problema que não havia percebido antes. No meu aplicativo Rails, meus campos de texto são definidos como 'string', e isso segue para o esquema do banco de dados. O processo descrito aqui resulta neles sendo definidos como VARCHAR (255) no banco de dados MySQL. Isso coloca um limite de 255 caracteres nesses tamanhos de campo - e qualquer coisa além disso foi truncada silenciosamente durante a importação. Para suportar textos com tamanho superior a 255, o esquema do MySQL precisaria usar 'TEXT' em vez de VARCHAR (255), acredito. O processo definido aqui não inclui essa conversão.
Aqui está o script Python mesclado e revisado que funcionou para meus dados:
fonte
Recentemente, tive que migrar do MySQL para JavaDB para um projeto em que nossa equipe está trabalhando. Encontrei uma biblioteca Java escrita pelo Apache chamada DdlUtils que facilitou bastante isso. Ele fornece uma API que permite fazer o seguinte:
As ferramentas com as quais terminamos não eram completamente automatizadas, mas funcionavam muito bem. Mesmo que seu aplicativo não esteja em Java, não deve ser muito difícil preparar algumas ferramentas pequenas para fazer uma migração única. Acho que consegui extrair nossa migração com menos de 150 linhas de código.
fonte
Não há necessidade de nenhum script, comando, etc ...
você só precisa exportar seu banco de dados sqlite como um
.csv
arquivo e depois importá-lo no Mysql usando phpmyadmin.Eu usei e funcionou incrível ...
fonte
Baseado na solução de Jims: maneira fácil e rápida de migrar o SQLite3 para o MySQL?
Isso funciona para mim. Eu uso o sed apenas para lançar a primeira linha, que não é semelhante ao mysql, mas você também pode modificar o script dump.py para jogar essa linha fora.
fonte
Obter um dump SQL
Importar despejo para MySQL
Para pequenas importações:
ou
Isso solicitará uma senha. Observação: se você quiser digitar sua senha diretamente, precisará fazê-lo SEM espaço, logo após
-p
:Para lixões maiores:
mysqlimport ou outras ferramentas de importação como o BigDump .
O BigDump oferece uma barra de progresso:
fonte
Ha ... eu gostaria de ter encontrado isso primeiro! Minha resposta foi para este post ... script para converter arquivo sql de despejo mysql em formato que pode ser importado para sqlite3 db
Combinar os dois seria exatamente o que eu precisava:
Quando o banco de dados sqlite3 for usado com o ruby, você poderá alterar:
para:
infelizmente, essa metade só funciona porque mesmo que você esteja inserindo 1 e 0 em um campo marcado como booleano, o sqlite3 os armazena como 1 e 0, para que você tenha que fazer algo como:
mas foi útil ter o arquivo sql para procurar todos os booleanos.
fonte
Eu escrevi esse script simples em Python3. Ele pode ser usado como uma classe incluída ou um script independente chamado por meio de um shell de terminal. Por padrão, importa todos os números inteiros as
int(11)
e strings asvarchar(300)
, mas tudo o que pode ser ajustado nos argumentos construtor ou script, respectivamente.NOTA: Requer o MySQL Connector / Python 2.0.4 ou superior
Aqui está um link para a fonte no GitHub, se você achar o código abaixo difícil de ler: https://github.com/techouse/sqlite3-to-mysql
fonte
Este script está ok, exceto neste caso que, é claro, eu conheci:
O script deve fornecer esta saída:
Mas, ao contrário, fornece essa saída:
com alguns caracteres estranhos não-ascii nos últimos 0 e 1.
Isso não apareceu mais quando eu comentei as seguintes linhas do código (43-46), mas outros problemas apareceram:
Este é apenas um caso especial, quando queremos adicionar um valor sendo 'f' ou 't', mas não me sinto muito à vontade com expressões regulares, só queria identificar esse caso para ser corrigido por alguém.
De qualquer forma, muito obrigado por esse script acessível !!!
fonte
Esta solução simples funcionou para mim:
fonte
cuidado com as instruções CREATE
fonte