Mở tệp cơ sở dữ liệu từ trong trình bao dòng lệnh SQLite


91

Tôi đang sử dụng SQLite Command Line Shell . Theo tài liệu, tôi có thể mở cơ sở dữ liệu bằng cách cung cấp nó làm đối số cho tệp thực thi:

sqlite3 data.db

Tôi không thể tìm ra cách mở tệp cơ sở dữ liệu từ bên trong công cụ sau khi đã gọi nó mà không cung cấp tệp dưới dạng đối số dòng lệnh (nếu tôi, chẳng hạn, nhấp đúp vào sqlite3.exe trong Windows). Lệnh trong công cụ SQLite shell để chỉ định tệp cơ sở dữ liệu là gì?

Câu trả lời:


111

Bạn có thể đính kèm một và thậm chí nhiều cơ sở dữ liệu và làm việc với nó theo cách tương tự như sử dụng sqlite dbname.db

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

và bạn có thể xem tất cả các cơ sở dữ liệu đính kèm với .databases

trong đó theo cách thông thường, main được sử dụng cho dòng lệnh db

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

14
Ah! Cảm ơn bạn. Làm cách nào để chỉ định cơ sở dữ liệu nào tôi muốn sqlite chạy các truy vấn của tôi?
Nolan Amy

Có bình thường khi xuất hiện một tập dữ liệu tạm thời mà không được tạo không?

Bạn chỉ định cơ sở dữ liệu bằng cách thêm tiền tố tên bảng với tên cơ sở dữ liệu. Trong ví dụ trên tiền tố sẽ là "db1", do đó ví dụSELECT * FROM db1.tbl1;
bugmenot123

19

Tôi nghĩ rằng cách đơn giản nhất để chỉ mở một cơ sở dữ liệu và bắt đầu truy vấn là:

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

Lưu ý: Điều này chỉ hoạt động cho các phiên bản 3.8.2+


11

Lệnh trong trình bao Sqlite để mở cơ sở dữ liệu là .open

Cú pháp là,

sqlite> .open dbasename.db

Nếu đó là một cơ sở dữ liệu mới mà bạn muốn tạo và mở, nó là

sqlite> .open --new dbasename.db

Nếu cơ sở dữ liệu đang tồn tại trong một thư mục khác, đường dẫn phải được đề cập như sau:

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

Trong Windows Command shell, bạn nên sử dụng '\' để đại diện cho một thư mục, nhưng trong SQLite các thư mục được biểu thị bằng '/'. Nếu bạn vẫn muốn sử dụng ký hiệu Windows, bạn nên sử dụng một chuỗi thoát cho mỗi '\'


9

Tương tự như cách bạn làm trong hệ thống db khác, bạn có thể sử dụng tên của db để xác định các bảng có tên kép. tên bảng duy nhất có thể được sử dụng trực tiếp.

select * from ttt.table_name;

hoặc nếu tên bảng trong tất cả các cơ sở dữ liệu đính kèm là duy nhất

select * from my_unique_table_name;

Nhưng tôi nghĩ rằng sqlite-shell chỉ dành cho việc tra cứu thủ công hoặc thao tác dữ liệu thủ công và theo cách này thì không cần thiết hơn

thông thường bạn sẽ sử dụng sqlite-command-line trong một script


Có thể có câu lệnh select tìm nạp các bản ghi từ tất cả các cơ sở dữ liệu đính kèm, trong trường hợp tên bảng giống nhau trên các cơ sở dữ liệu đính kèm không?
user826955 18/12/12

5

Bạn chỉ cần chỉ định tên tệp cơ sở dữ liệu trong dòng lệnh:

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

Hơn nữa, bạn có thể thực hiện truy vấn của mình từ dòng lệnh:

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

Bạn có thể đính kèm một tệp cơ sở dữ liệu khác từ SQLite shell:

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                      

Các bảng từ cơ sở dữ liệu thứ 2 này sẽ có thể truy cập được thông qua tiền tố của cơ sở dữ liệu:

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

Nhưng ai biết cách chỉ định nhiều tệp cơ sở dữ liệu từ dòng lệnh để thực hiện truy vấn từ dòng lệnh?


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

Các shell dòng lệnh SQLite cũ hơn ( sqlite3.exe) dường như không cung cấp .openlệnh hoặc bất kỳ sự thay thế dễ nhận dạng nào.

Mặc dù tôi không tìm thấy tài liệu tham khảo cuối cùng nào nhưng có vẻ như .openlệnh đã được giới thiệu xung quanh phiên bản 3.15 . Các Lịch sử phát hành SQLite đầu tiên đề cập đến .openlệnh với 2016/10/14 (3.15.0).


1

Tôi tự hỏi tại sao không ai có thể hiểu được những gì câu hỏi thực sự đặt ra. Nó nêu rõ Lệnh trong công cụ SQLite shell để chỉ định một tệp cơ sở dữ liệu là gì?

Một db sqlite trên đĩa cứng của tôi E:\ABCD\efg\mydb.db. Làm cách nào để truy cập nó bằng giao diện dòng lệnh sqlite3?.open E:\ABCD\efg\mydb.dbkhông hoạt động. Đây là những gì câu hỏi được đặt ra.

Tôi thấy cách tốt nhất để làm công việc là

  • sao chép-dán tất cả các tệp db của bạn trong 1 thư mục (giả sử E:\ABCD\efg\mydbs)
  • chuyển sang thư mục đó trong dòng lệnh của bạn
  • bây giờ mở sqlite3và sau đó.open mydb.db

Bằng cách này, bạn cũng có thể thực hiện thao tác nối trên các bảng khác nhau thuộc các cơ sở dữ liệu khác nhau.


Bạn đã thử E:trước chưa? Thông thường Windows không thích tham chiếu các thư mục trên các ổ đĩa khác mà không tự thay đổi ký tự.
Aaron Franke

1
Có, nó hoạt động, nhưng điều đó sẽ không khả thi khi bạn cần nối các bảng khác nhau từ các cơ sở dữ liệu khác nhau. Cơ sở dữ liệu đính kèm sẽ không còn được đính kèm sau khi bạn thoát và thay đổi thư mục.
Ritwik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.