Sqlite使用命令行

时间:2011-09-14 10:30:09

标签: sql sqlite

Sqlite有点令人沮丧。每次运行命令时,我都无法使用向上向下的向右箭头来检索以前键入的命令。有没有办法启用它?

另一个问题: 我有下表

CREATE TABLE resource (
    resourceID INTEGER PRIMARY KEY AUTOINCREMENT,
    resourceType STRING,
    userID INTEGER DEFAULT -1
);

我插入如下:

insert into resource values(null, "razor");

但它不允许我这样做,因为我只插入了2列而没有为userID列指定任何内容。但我认为DEFAULT的意思是如果没有插入任何内容,则将值默认为-1。我在这里错过了什么吗?

6 个答案:

答案 0 :(得分:21)

要使箭头键在sqlite3命令提示符下工作,需要将sqlite3二进制文件链接到readline库。您可以通过以下方式检查:

$ ldd $(which sqlite3)

就我而言,我发现sqlite3命令实际上是在安装的Android SDK中使用sqlite3版本,运行:

$ which sqlite3
/opt/google/android-sdk/tools/sqlite3

该版本没有readline库链接,而/ usr / bin / sqlite3则没有。所以我所做的就是将Android SDK中的sqlite3移开(我仍然希望能够访问该目录中的其他工具 - 但是我最好从/ usr / local / bin或〜/ bin创建符号链接),并且运行sqlite3现在使用/ usr / bin / sqlite3,其中readline链接到可执行文件中,向上/向下箭头键将在那里工作。

答案 1 :(得分:15)

快速解决方案是启动具有ReadLine支持的SQLite,如下所示:

rlwrap sqlite3 database.db

如果未安装rlwrap,您可以使用以下命令在Ubuntu上执行此操作:

sudo apt-get install rlwrap

对于其他Linux版本,请检查here

rlwrap是一个ReadLine包装器,一个小实用程序,它使用GNU readline库来允许编辑任何其他命令的键盘输入。

答案 2 :(得分:11)

我在OS X上遇到了同样的问题。

为了解决这个问题,你需要自己编译sqlite3。预编译的二进制文件不能假设您已获得readline支持,因此他们将其排除在外。

如果您从http://www.sqlite.org/download.html下载“autoconf”来源(第二个链接,当前为http://www.sqlite.org/sqlite-autoconf-3071300.tar.gz):

然后你可以通过终端编译它(cd到tarball提取的目录):

$ ./configure
$ make
$ sudo make install

它将自动识别OS X具有readline和curses支持,并且您的新sqlite3二进制文件将按预期响应箭头,删除密钥等。

答案 3 :(得分:1)

第一个问题:你的insert语句包含2个字段,但你的表有3个字段,所以它不明确。 SQLite无法确定您要设置的字段。第二个问题是:如果要使用自动增量,请不要将resourceID设置为null。

试试这个:

insert into resource(resourceType) values ("razor");

这会将resourceID设置为自动增量的下一个值,将userID设置为默认值。

答案 4 :(得分:1)

以下是两个问题的两个答案:

  1. 我发现使用sqlite3命令行客户端我的箭头键没有问题。

  2. 您的INSERT语句中有两个错误:

    • 您不应为AUTOINCREMENT列提供值。

    • 您应列出列以及映射值的顺序。当你没有与列相同数量的值时,这是必需的,但即使这样做也是很好的做法,因为对表结构的后续更改可能会改变列的顺序或数量。

    • 此外,单引号在SQL数据库中更为标准。 SQLite会接受双引号,其他一些程序则不会。

      INSERT INTO Resource(ResourceType)VALUES('razor')

答案 5 :(得分:1)

我正在使用Linux Mint并且有相同的sqlite3问题,但部分解决了这里的答案。我最初使用的是anaconda中的sqlite3,它没有readline支持。

在anaconda中重命名sqlite3文件后,如上所述使用autoconf重新安装仍然无法解决问题。 ldd命令没有显示readline.so的链接:

$ ldd $(which sqlite3)

linux-vdso.so.1 =>  (0x00007ffebb3a4000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8aceb9e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8ace980000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8ace5bb000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8aceda2000)

然后,

$ sudo dpkg -r sqlite3

然后重新安装就行了。