Como despejo os dados, e somente os dados, e não o esquema, de algumas tabelas SQLite3 de um banco de dados (nem todas as tabelas)? O dump deve estar no formato SQL, pois deve ser facilmente inserido novamente no banco de dados posteriormente e deve ser feito na linha de comando. Algo como
sqlite3 db .dump
mas sem despejar o esquema e selecionar quais tabelas despejar.
Respostas:
Você não está dizendo o que deseja fazer com o arquivo despejado.
Eu usaria o seguinte para obter um arquivo CSV, que eu possa importar em quase tudo
Se você deseja reinserir em um banco de dados SQLite diferente, então:
fonte
Você pode fazer isso obtendo a diferença dos comandos .schema e .dump. por exemplo com grep:
data.sql
O arquivo conterá apenas dados sem esquema, algo como isto:Espero que isso ajude você.
fonte
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
não funciona, masecho '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
funciona bem);
, e o grep remove todas as linhas que contêm);
Adicionar a-x
opção ao grep resolve esse problema.Não é a melhor maneira, mas, pelo menos, não precisa de ferramentas externas (exceto grep, que é padrão nas caixas * nix de qualquer maneira)
mas você precisa executar este comando para cada tabela que está procurando.
Observe que isso não inclui o esquema.
fonte
sqlite3 Database.s3db .dump
grep -v '^CREATE'
como sugerido em uma das outras respostasgrep -v '^CREATE;
será interrompido se asCREATE
instruções tiverem quebras de linha (o que às vezes ocorrem). O melhor, IMO, é não retirar automaticamente asCREATE
instruções, mas editá-las manualmente. Basta usar o editor de texto que você precisa e procurarCREATE
e remover manualmente essas instruções. Contanto que o banco de dados não seja enorme (e como você está usando o sqlite, acho que é nota), isso é bem simples.Você pode especificar um ou mais argumentos da tabela para o comando especial .dump, por exemplo
sqlite3 db ".dump 'table1' 'table2'"
.fonte
sqlite3 3.31.1 (2020/01/27)
. O changelog não diz nada sobre isso. (A propósito,--preserve-rowids
funciona, mas não está documentado.)Qualquer resposta que sugira o uso de grep para excluir as
CREATE
linhas ou apenas pegar asINSERT
linhas dasqlite3 $DB .dump
saída falhará muito. OsCREATE TABLE
comandos listam uma coluna por linha (portanto, a exclusãoCREATE
não será tudo) e os valores nasINSERT
linhas podem incluir novas linhas incorporadas (para que você não possa pegar apenas asINSERT
linhas).Testado no sqlite3 versão 3.6.20.
Se você deseja excluir determinadas tabelas, pode filtrá-las
$(sqlite $DB .tables | grep -v -e one -e two -e three)
ou, se deseja obter um subconjunto específico, substitua-o porone two three
.fonte
Como uma melhoria na resposta de Paul Egan, isso pode ser realizado da seguinte maneira:
--ou--
A ressalva, é claro, é que você precisa ter o grep instalado.
fonte
cat database.sql | grep '^INSERT' > database_inserts.sql
(o mesmo para esquema, substitua-o porgrep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
quecat
é supérfluocat
custos basicamente nada para executar e tornam a cadeia de entrada e saída muito mais clara. Obviamente, você também pode escrever,< database.sql grep '^INSERT' ...
mas um canal explícito é muito mais fácil de ler.Em Python ou Java ou qualquer linguagem de alto nível, o .dump não funciona. Precisamos codificar a conversão para CSV manualmente. Eu dou um exemplo de Python. Outros, exemplos seriam apreciados:
Se você tiver 'dados do painel, em outras palavras, muitas entradas individuais com IDs adicionam isso ao com look e também despejam estatísticas de resumo:
fonte
De acordo com a documentação SQLite do Command Line Shell For SQLite, você pode exportar uma tabela SQLite (ou parte de uma tabela) como CSV, simplesmente configurando o "mode" como "csv" e, em seguida, execute uma consulta para extrair as linhas desejadas. a mesa:
Em seguida, use o comando ".import" para importar dados CSV (valor separado por vírgula) em uma tabela SQLite:
Leia a documentação adicional sobre os dois casos a serem considerados: (1) a tabela "tab1" não existe anteriormente e (2) a tabela "tab1" já existe.
fonte
O melhor método seria usar o código que o dump sqlite3 db faria, excluindo as partes do esquema.
Exemplo de pseudocódigo:
Consulte:
src/shell.c:838
(para sqlite-3.5.9) para obter o código realVocê pode até pegar esse shell e comentar as partes do esquema e usá-lo.
fonte
Revisão de outras soluções possíveis
Incluir apenas INSERTs
Fácil de implementar, mas falhará se alguma de suas colunas incluir novas linhas
Modo de inserção SQLite
Essa é uma solução agradável e personalizável, mas não funciona se suas colunas tiverem objetos de blob como o tipo 'Geometria' em espacialidade
Difere o despejo com o esquema
Não sei por que, mas não está funcionando para mim
Outra (nova) solução possível
Provavelmente não há uma resposta melhor para essa pergunta, mas uma que está funcionando para mim é grep as inserções, levando em consideração que há novas linhas nos valores da coluna com uma expressão como esta
Para selecionar as tabelas a serem despejadas,
.dump
admite um argumento LIKE para corresponder aos nomes das tabelas, mas se isso não for suficiente, provavelmente um script simples é a melhor opçãoou, algo mais elaborado para respeitar chaves estrangeiras e encapsular todo o despejo em apenas uma transação
Leve em consideração que a expressão grep falhará se
);
houver uma string presente em qualquer uma das colunasPara restaurá-lo (em um banco de dados com as tabelas já criadas)
fonte
Esta versão funciona bem com novas linhas dentro de inserções:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
Na prática, exclui todas as linhas iniciadas pelas
CREATE
quais é menos provável que contenham novas linhasfonte
A resposta por retracile deve ser a mais próxima, mas não funciona no meu caso. Uma consulta de inserção apenas quebrou no meio e a exportação simplesmente parou. Não tenho certeza qual é o motivo. No entanto, funciona bem durante
.dump
.Por fim, escrevi uma ferramenta para dividir o SQL gerado a partir de
.dump
:https://github.com/motherapp/sqlite_sql_parser/
fonte
Você pode fazer uma seleção nas tabelas inserindo vírgulas após cada campo para produzir um csv ou usar uma ferramenta GUI para retornar todos os dados e salvá-los em um csv.
fonte