【问题标题】:Opening database file from within SQLite command-line shell从 SQLite 命令行 shell 中打开数据库文件
【发布时间】:2012-02-21 21:18:42
【问题描述】:

我正在使用SQLite Command Line Shell。如文档所述,我可以通过将数据库作为参数提供给可执行文件来打开数据库:

sqlite3 data.db

在没有将文件作为命令行参数提供的情况下调用它后,我无法弄清楚如何从 在工具中打开数据库文件(例如,如果我双击 sqlite3.exe在 Windows 中)。

SQLite shell 工具中指定数据库文件的命令是什么?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

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

    虽然我没有找到明确的参考资料,但似乎 .open 命令是在 3.15 版本中引入的。 SQLite Release History 首先提到 .open 命令与 2016-10-14 (3.15.0)。

    【讨论】:

      【解决方案2】:

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

      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
      

      但是谁知道如何在命令行中指定多个数据库文件来执行命令行查询呢?

      【讨论】:

        【解决方案3】:

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

        语法是,

        sqlite> .open dbasename.db
        

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

        sqlite> .open --new dbasename.db
        

        如果数据库存在于不同的文件夹中,则必须像这样提及路径:

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

        在 Windows Command shell 中,你应该使用 '\' 来表示一个目录,但是在 SQLite 中,目录是用 '/' 来表示的。 如果您仍然喜欢使用 Windows 表示法,则应为每个 '\' 使用转义序列

        【讨论】:

          【解决方案4】:
          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.
          

          【讨论】:

            【解决方案5】:

            我想知道为什么没有人能够得到问题的实际问题。它说明了SQLite shell 工具中指定数据库文件的命令是什么?

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

            我发现做这项工作的最佳方式是

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

            这样你也可以对属于不同数据库的不同表进行join操作。

            【讨论】:

            • 你试过E:吗?很多时候,Windows 不喜欢在不自己更改字母的情况下引用其他驱动器上的目录。
            • 是的,它可以工作,但是当您需要连接来自不同数据库的不同表时,这是不可行的。退出并更改目录后,附加的数据库将不再附加。
            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

              select * from ttt.table_name;
              

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

              select * from my_unique_table_name;
              

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

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

              【讨论】:

              • 是否可以有一个 select 语句从所有附加数据库中获取记录,以防附加数据库中的表名相同?
              【解决方案8】:

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

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

              你可以看到所有附加的数据库 .数据库

              其中main通常用于命令行数据库

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

              【讨论】:

              • 啊!谢谢你。如何指定我希望 sqlite 在哪个数据库上运行我的查询?
              • 临时数据集没有创建就出现正常吗?
              • 通过在表名前加上数据库名来指定数据库。在上面的示例中,前缀是“db1”,例如SELECT * FROM db1.tbl1;
              猜你喜欢
              • 1970-01-01
              • 2021-04-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-11
              • 2014-08-30
              相关资源
              最近更新 更多