从SQLite命令行外壳程序中打开数据库文件


91

我正在使用SQLite命令行外壳程序。如前所述,我可以通过将数据库作为可执行文件的参数提供来打开数据库:

sqlite3 data.db

我无法弄清楚如何在调用工具后不从文件中提供数据库文件作为命令行参数(例如,如果我在Windows中双击sqlite3.exe)来打开该文件。SQLite Shell工具中用于指定数据库文件的命令是什么?

Answers:


111

您可以附加一个或多个数据库并以与使用sqlite dbname.db相同的方式使用它

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

您可以看到所有带有.databases的附加数据库

正常情况下,main用于命令行数据库

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

14
啊! 谢谢。如何指定我希望sqlite在哪个数据库上运行我的查询?
诺兰·艾米

不创建临时数据集是否正常?

您可以通过在表名前添加数据库名来指定数据库。在上面的示例中,前缀为“ db1”,例如SELECT * FROM db1.tbl1;
bugmenot123 '19

19

我认为打开一个数据库并开始查询的最简单方法是:

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

注意:这仅适用于3.8.2+版本


11

在Sqlite shell中打开数据库的命令是.open

语法是

sqlite> .open dbasename.db

如果它是您要创建和打开的新数据库,则为

sqlite> .open --new dbasename.db

如果数据库存在于其他文件夹中,则必须这样提及路径:

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

在Windows Command Shell中,应使用“ \”代表目录,而在SQLite中,目录则由“ /”代表。如果仍然希望使用Windows表示法,则应对每个'\'使用转义序列


9

与在其他数据库系统中执行此操作的方法相同,可以使用数据库名称来标识双命名表。唯一的表名可以直接使用。

select * from ttt.table_name;

或者所有附加数据库中的表名都是唯一的

select * from my_unique_table_name;

但是我认为sqlite-shell的仅用于手动查找或手动数据操作,因此这种方式更加无关紧要

通常您会在脚本中使用sqlite-command-line


如果表名称在所有附加数据库中都相同,是否可能有一条select语句从所有附加数据库中获取记录?
user826955

5

您可以简单地在命令行中指定数据库文件名:

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

此外,您可以从命令行执行查询:

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

您可以从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                      

通过数据库的前缀可以访问该第二数据库中的表:

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

但是谁知道如何从命令行指定多个数据库文件以从命令行执行查询?


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

较旧的SQLite命令行shell(sqlite3.exe)似乎不提供该.open命令或任何易于识别的替代方法。

尽管我没有找到明确的参考,但该.open命令似乎是在3.15版左右引入的。在SQLite的发布历史首先提到了.open与2016年10月14日(3.15.0)命令。


1

我不知道为什么没人能真正回答这个问题。它说明了SQLite Shell工具中用于指定数据库文件的命令是什么?

sqlite db在我的硬盘上E:\ABCD\efg\mydb.db。如何使用sqlite3命令行界面访问它?.open E:\ABCD\efg\mydb.db不起作用。这是问什么问题。

我发现做这项工作的最好方法是

  • 将所有数据库文件复制粘贴到1个目录中(例如E:\ABCD\efg\mydbs
  • 在命令行中切换到该目录
  • 现在打开sqlite3,然后.open mydb.db

这样,您也可以对属于不同数据库的不同表执行联接操作。


E:先尝试了吗?Windows通常不喜欢自己更改字母而不引用其他驱动器上的目录。
亚伦·弗兰克

1
是的,它可以工作,但是当您需要连接来自不同数据库的不同表时,这将不可行。退出并更改目录后,将不再附加已附加的数据库。
Ritwik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.