Abrindo arquivo de banco de dados de dentro do shell de linha de comando SQLite

91

Estou usando o SQLite Command Line Shell . Conforme documentado, posso abrir um banco de dados fornecendo-o como um argumento para o executável:

sqlite3 data.db

Não consigo descobrir como abrir um arquivo de banco de dados de dentro da ferramenta depois de invocá-lo sem fornecer o arquivo como um argumento de linha de comando (se eu, digamos, clicar duas vezes em sqlite3.exe no Windows). Qual é o comando dentro da ferramenta de shell SQLite para especificar um arquivo de banco de dados?

Nolan Amy
fonte

Respostas:

111

Você pode anexar um ou mais bancos de dados e trabalhar com eles da mesma maneira que usar sqlite dbname.db

sqlite3
:
sqlite> attach "mydb.sqlite" as db1;

e você pode ver todos os bancos de dados anexados com .databases

onde normalmente o principal é usado para o banco de dados da linha de comando

.databases
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main                                                                       
1    temp                                                                       
2    ttt              c:\home\user\gg.ite                                   
formiga
fonte
14
Ah! Obrigado. Como posso especificar em qual banco de dados desejo que o sqlite execute minhas consultas?
Nolan Amy
É normal surgir um conjunto de dados temporário sem ser criado?
Você especifica o banco de dados prefixando o nome da tabela com o nome do banco de dados. No exemplo acima, o prefixo seria "db1", por exemploSELECT * FROM db1.tbl1;
bugmenot123
19

Acho que a maneira mais simples de apenas abrir um único banco de dados e começar a consultar é:

sqlite> .open "test.db"
sqlite> SELECT * FROM table_name ... ;

Aviso: Isso funciona apenas para as versões 3.8.2+

rindeal
fonte
11

O comando dentro do shell Sqlite para abrir um banco de dados é .open

A sintaxe é,

sqlite> .open dbasename.db

Se for um novo banco de dados que você gostaria de criar e abrir, é

sqlite> .open --new dbasename.db

Se o banco de dados existir em uma pasta diferente, o caminho deve ser mencionado assim:

sqlite> .open D:/MainFolder/SubFolder/...database.db

No shell do Windows Command, você deve usar '\' para representar um diretório, mas nos diretórios SQLite são representados por '/'. Se você ainda preferir usar a notação do Windows, deve usar uma sequência de escape para cada '\'

Ammu
fonte
9

Da mesma forma que você faz em outro sistema de banco de dados, você pode usar o nome do banco de dados para identificar tabelas com nomes duplos. tablenames exclusivos podem ser usados ​​diretamente.

select * from ttt.table_name;

ou se o nome da tabela em todos os bancos de dados anexados é exclusivo

select * from my_unique_table_name;

Mas eu acho que o de sqlite-shell é apenas para pesquisa manual ou manipulação manual de dados e, portanto, desta forma é mais inconseqüente

normalmente você usaria a linha de comando sqlite em um script

formiga
fonte
É possível ter uma instrução select que busca registros de todos os bancos de dados anexados, caso o nome da tabela seja o mesmo em todos os bancos de dados anexados?
user826955
5

Você pode simplesmente especificar o nome do arquivo de banco de dados na linha de comando:

bash-3.2 # sqlite3 UserDb.sqlite
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.

sqlite> .databases
main: /db/UserDb.sqlite

sqlite> .tables
accountLevelSettings  genres               syncedThumbs
collectionActivity    recordingFilter      thumbs
contentStatus         syncedContentStatus 

sqlite> select count(*) from genres;
10

Além disso, você pode executar sua consulta na linha de comando:

bash-3.2 # sqlite3 UserDb.sqlite 'select count(*) from genres'
10

Você pode anexar outro arquivo de banco de dados do shell SQLite:

sqlite> attach database 'RelDb.sqlite' as RelDb;

sqlite> .databases
main: /db/UserDb.sqlite
RelDb: /db/RelDb_1.sqlite

sqlite> .tables
RelDb.collectionRelationship  contentStatus               
RelDb.contentRelationship     genres                      
RelDb.leagueRelationship      recordingFilter             
RelDb.localizedString         syncedContentStatus         
accountLevelSettings          syncedThumbs                
collectionActivity            thumbs                      

As tabelas desta 2ª base de dados estarão acessíveis via prefixo da base de dados:

sqlite> select count(*) from RelDb.localizedString;
2442

Mas quem sabe como especificar vários arquivos de banco de dados na linha de comando para executar a consulta na linha de comando?

Alexander Gavriliuk
fonte
2
create different db files using
      >sqlite3 test1.db
sqlite> create table test1 (name text);
sqlite> insert into test1 values('sourav');
sqlite>.exit
      >sqlite3 test2.db
sqlite> create table test2 (eid integer);
sqlite> insert into test2 values (6);
sqlite>.exit
      >sqlite
SQLite version 3.8.5 2014-06-04 14:06:34
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open test1.db
sqlite> select * from test1;
sourav
sqlite> .open test2.db
sqlite> select * from test1;
Error: no such table: test1
sqlite> select * from test2;
6
sqlite> .exit
      >

Thank YOU.
Sourav Ghadai
fonte
2

Os shells de linha de comando SQLite mais antigos ( sqlite3.exe) não parecem oferecer o .opencomando ou qualquer alternativa prontamente identificável.

Embora eu não tenha encontrado nenhuma referência definitiva, parece que o .opencomando foi introduzido por volta da versão 3.15 . O SQLite Release History menciona primeiro o .opencomando com 2016-10-14 (3.15.0).

ScottWelker
fonte
1

Eu me pergunto por que ninguém foi capaz de entender o que a pergunta realmente perguntou. Ele declarou qual é o comando dentro da ferramenta de shell SQLite para especificar um arquivo de banco de dados?

Um banco de dados sqlite está no meu disco rígido E:\ABCD\efg\mydb.db. Como faço para acessá-lo com a interface de linha de comando sqlite3? .open E:\ABCD\efg\mydb.dbnão funciona. Esta é a pergunta feita.

Eu descobri que a melhor maneira de fazer o trabalho é

  • copie e cole todos os seus arquivos db em um diretório (digamos E:\ABCD\efg\mydbs)
  • mude para esse diretório em sua linha de comando
  • agora aberto sqlite3e então.open mydb.db

Desta forma, você também pode fazer a operação de junção em diferentes tabelas pertencentes a diferentes bancos de dados.

Ritwik
fonte
Você tentou E:primeiro? Muitas vezes, o Windows não gosta de fazer referência a diretórios em outras unidades sem alterar a letra você mesmo.
Aaron Franke
1
Sim, funciona, mas não será viável quando você precisar juntar tabelas diferentes de bancos de dados diferentes. Os bancos de dados anexados não serão mais anexados quando você sair e alterar o diretório.
Ritwik de