Otwieranie pliku bazy danych z poziomu powłoki wiersza poleceń SQLite


92

Używam powłoki wiersza poleceń SQLite . Zgodnie z dokumentacją mogę otworzyć bazę danych, dostarczając ją jako argument do pliku wykonywalnego:

sqlite3 data.db

Nie mogę dowiedzieć się, jak otworzyć plik bazy danych z poziomu narzędzia po wywołaniu go bez podania pliku jako argumentu wiersza poleceń (jeśli, powiedzmy, dwukrotnie kliknę sqlite3.exe w systemie Windows). Jakie polecenie w narzędziu powłoki SQLite służy do określenia pliku bazy danych?

Odpowiedzi:


112

Możesz dołączyć jedną lub więcej baz danych i pracować z nimi w taki sam sposób, jak przy użyciu sqlite dbname.db

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

i możesz zobaczyć wszystkie dołączone bazy danych z

gdzie w normalny sposób main jest używany dla db wiersza poleceń

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

14
Ach! Dziękuję Ci. Jak mogę określić, w której bazie danych SQLite ma uruchamiać moje zapytania?
Nolan Amy

Czy to normalne, że tymczasowy zestaw danych nie jest tworzony?

Bazę danych określa się, poprzedzając nazwę tabeli nazwą bazy danych. W powyższym przykładzie prefiks byłby „db1”, więc np.SELECT * FROM db1.tbl1;
bugmenot123

20

Myślę, że najprostszym sposobem na otwarcie pojedynczej bazy danych i rozpoczęcie zapytań jest:

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

Uwaga: działa to tylko dla wersji 3.8.2+


11

Polecenie w powłoce Sqlite do otwarcia bazy danych to .open

Składnia to:

sqlite> .open dbasename.db

Jeśli jest to nowa baza danych, którą chciałbyś utworzyć i otworzyć, tak właśnie jest

sqlite> .open --new dbasename.db

Jeśli baza danych znajduje się w innym folderze, ścieżkę należy podać w następujący sposób:

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

W powłoce poleceń Windows powinieneś używać „\” do reprezentowania katalogu, ale w katalogach SQLite są reprezentowane przez „/”. Jeśli nadal wolisz używać notacji Windows, powinieneś użyć sekwencji ucieczki dla każdego „\”


9

W ten sam sposób, w jaki robisz to w innym systemie baz danych, możesz użyć nazwy bazy danych do identyfikacji podwójnie nazwanych tabel. unikalne nazwy tabel mogą być używane bezpośrednio.

select * from ttt.table_name;

lub jeśli nazwa tabeli we wszystkich dołączonych bazach danych jest unikalna

select * from my_unique_table_name;

Ale myślę, że z sqlite-shell służy tylko do ręcznego wyszukiwania lub ręcznej manipulacji danymi i dlatego jest to bardziej nieistotne

normalnie użyłbyś linii poleceń sqlite w skrypcie


Czy można mieć instrukcję select, która pobiera rekordy ze wszystkich dołączonych baz danych, w przypadku gdy nazwa tabeli jest taka sama we wszystkich dołączonych bazach danych?
user826955

5

Możesz po prostu podać nazwę pliku bazy danych w wierszu poleceń:

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

Ponadto możesz wykonać swoje zapytanie z wiersza poleceń:

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

Możesz dołączyć inny plik bazy danych z powłoki 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                      

Tabele z tej drugiej bazy danych będą dostępne za pośrednictwem prefiksu bazy danych:

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

Ale kto wie, jak określić wiele plików bazy danych z wiersza poleceń, aby wykonać zapytanie z wiersza poleceń?


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

Wydaje się, że starsze powłoki wiersza poleceń SQLite ( sqlite3.exe) nie oferują tego .openpolecenia ani żadnej łatwej do zidentyfikowania alternatywy.

Chociaż nie znalazłem ostatecznego odniesienia, wydaje się, że .openpolecenie zostało wprowadzone około wersji 3.15 . SQLite Release Historia Pierwsze wzmianki o .openpolecenie z 2016-10-14 (3.15.0).


1

Zastanawiam się, dlaczego nikt nie był w stanie zrozumieć tego, o co chodziło w rzeczywistości. Stwierdzono, jakie polecenie w narzędziu powłoki SQLite określa plik bazy danych?

Na moim dysku twardym znajduje się baza danych sqlite E:\ABCD\efg\mydb.db. Jak uzyskać do niego dostęp za pomocą interfejsu wiersza poleceń sqlite3? .open E:\ABCD\efg\mydb.dbnie działa. Oto jakie zadano pytanie.

Znalazłem najlepszy sposób na wykonanie tej pracy

  • skopiuj i wklej wszystkie swoje pliki db w 1 katalogu (powiedzmy E:\ABCD\efg\mydbs)
  • przełącz się do tego katalogu w linii poleceń
  • teraz otwarte, sqlite3a potem.open mydb.db

W ten sposób możesz wykonać operację łączenia również na różnych tabelach należących do różnych baz danych.


Czy próbowałeś E:pierwszy? Często system Windows nie lubi odwoływać się do katalogów na innych dyskach bez samodzielnej zmiany litery.
Aaron Franke,

1
Tak, działa, ale nie będzie to możliwe, gdy będziesz musiał łączyć różne tabele z różnych baz danych. Dołączone bazy danych nie będą już dołączane po wyjściu i zmianie katalogu.
Ritwik
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.