Apertura del file di database dalla shell della riga di comando di SQLite


91

Sto usando SQLite Command Line Shell . Come documentato, posso aprire un database fornendolo come argomento all'eseguibile:

sqlite3 data.db

Non riesco a capire come aprire un file di database dall'interno dello strumento dopo averlo invocato senza fornire il file come argomento della riga di comando (se, ad esempio, faccio doppio clic su sqlite3.exe in Windows). Qual è il comando all'interno dello strumento della shell SQLite per specificare un file di database?

Risposte:


111

È possibile allegare uno o anche più database e lavorarci allo stesso modo di sqlite dbname.db

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

e puoi vedere tutti i database collegati con .databases

dove normalmente il main è usato per la riga di comando db

.databases
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main                                                                       
1    temp                                                                       
2    ttt              c:\home\user\gg.ite                                   

14
Ah! Grazie. Come faccio a specificare su quale database voglio che sqlite esegua le mie query?
Nolan Amy

È normale far emergere un dataset temporaneo senza essere creato?

Specificare il database anteponendo al nome della tabella il nome del database. Nell'esempio sopra il prefisso sarebbe "db1", quindi ad esSELECT * FROM db1.tbl1;
Bugmenot123

19

Penso che il modo più semplice per aprire un singolo database e iniziare a eseguire query sia:

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

Avviso: funziona solo per le versioni 3.8.2+


11

Il comando all'interno della shell Sqlite per aprire un database è .open

La sintassi è,

sqlite> .open dbasename.db

Se si tratta di un nuovo database che desideri creare e aprire, lo è

sqlite> .open --new dbasename.db

Se il database esiste in una cartella diversa, il percorso deve essere menzionato in questo modo:

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

Nella shell dei comandi di Windows, dovresti usare "\" per rappresentare una directory, ma nelle directory SQLite sono rappresentate da "/". Se preferisci ancora usare la notazione di Windows, dovresti usare una sequenza di escape per ogni "\"


9

Allo stesso modo in cui lo fai in un altro sistema db, puoi usare il nome del db per identificare le tabelle con doppio nome. tablenames unici possono essere utilizzati direttamente.

select * from ttt.table_name;

o se il nome della tabella in tutti i database collegati è univoco

select * from my_unique_table_name;

Ma penso che il of di sqlite-shell sia solo per la ricerca manuale o la manipolazione manuale dei dati e quindi in questo modo è più irrilevante

normalmente useresti sqlite-command-line in uno script


È possibile avere un'istruzione select che recupera i record da tutti i database collegati, nel caso in cui il nome della tabella sia lo stesso nei database collegati?
user826955

5

Puoi semplicemente specificare il nome del file del database nella riga di 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

Inoltre, puoi eseguire la tua query dalla riga di comando:

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

È possibile allegare un altro file di database dalla 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                      

Le tabelle di questo secondo database saranno accessibili tramite il prefisso del database:

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

Ma chi sa come specificare più file di database dalla riga di comando per eseguire la query dalla riga di comando?


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.

2

Le vecchie shell della riga di comando SQLite ( sqlite3.exe) non sembrano offrire il .opencomando o qualsiasi alternativa facilmente identificabile.

Sebbene non abbia trovato alcun riferimento definitivo, sembra che il .opencomando sia stato introdotto intorno alla versione 3.15 . La cronologia delle .openversioni di SQLite menziona per la prima volta il comando con 2016-10-14 (3.15.0).


1

Mi chiedo perché nessuno sia stato in grado di ottenere ciò che la domanda effettivamente poneva. Ha dichiarato Qual è il comando all'interno dello strumento della shell SQLite per specificare un file di database?

Un db sqlite è sul mio disco rigido E:\ABCD\efg\mydb.db. Come posso accedervi con l'interfaccia a riga di comando sqlite3? .open E:\ABCD\efg\mydb.dbnon funziona. Questa è la domanda posta.

Ho scoperto che il modo migliore per fare il lavoro è

  • copia-incolla tutti i tuoi file db in 1 directory (diciamo E:\ABCD\efg\mydbs)
  • passare a quella directory nella riga di comando
  • ora aperto sqlite3e poi.open mydb.db

In questo modo è possibile eseguire l' operazione di unione anche su tabelle diverse appartenenti a database diversi.


Hai provato E:prima? Spesso a Windows non piace fare riferimento a directory su altre unità senza cambiare la lettera da soli.
Aaron Franke

1
Sì, funziona, ma ciò non sarà possibile quando è necessario unire tabelle diverse da database diversi. I database allegati non verranno più collegati una volta usciti e modificati la directory.
Ritwik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.