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。我在这里错过了什么吗?
答案 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)
以下是两个问题的两个答案:
我发现使用sqlite3命令行客户端我的箭头键没有问题。
您的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
然后重新安装就行了。