Sqlite с использованием командной строки - PullRequest
16 голосов
/ 14 сентября 2011

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 ]

21 голосов
/ 28 октября 2013

Чтобы клавиши со стрелками работали в командной строке sqlite3, двоичный файл sqlite3 должен быть связан с библиотекой readline. Вы можете проверить это с помощью:

$ ldd $(which sqlite3)

В моем случае я обнаружил, что команда sqlite3 фактически использовала версию sqlite3 в установленном Android SDK, выполнив:

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

В этой версии отсутствует ссылка на библиотеку readline, а в / usr / bin / sqlite3. Поэтому я удалил sqlite3 в Android SDK (я все еще хочу получить доступ к другим своим инструментам в этом каталоге - но тогда мне лучше сделать символические ссылки из / usr / local / bin или ~ / bin ) и при запуске sqlite3 теперь используется файл / usr / bin / sqlite3 с readline, связанным с исполняемым файлом, и там будут работать клавиши со стрелками вверх / вниз.

15 голосов
/ 05 июня 2016

Быстрое решение - запустить SQLite с поддержкой ReadLine, как показано ниже:

rlwrap sqlite3 database.db

Если rlwrap не установлен, вы можете сделать это в Ubuntu с помощью команды:

sudo apt-get install rlwrap

Для других версий Linux отметьте здесь .

rlwrap - это оболочка ReadLine, небольшая утилита, использующая библиотеку readline GNU, позволяющую редактировать ввод с клавиатуры для любой другой команды.

11 голосов
/ 23 августа 2012

У меня была такая же проблема на OS X.

Чтобы это исправить, вам нужно скомпилировать sqlite3 самостоятельно. Предварительно скомпилированные двоичные файлы не могут предполагать, что у вас есть поддержка readline, поэтому они не учли этого.

Если вы загружаете источник "autoconf" из http://www.sqlite.org/download.html (вторая ссылка, в настоящее время http://www.sqlite.org/sqlite-autoconf-3071300.tar.gz):

, затем вы можете скомпилировать его через терминал (перейдите в каталог, в который распаковывается tar-архив):

$ ./configure
$ make
$ sudo make install

и он автоматически распознает, что OS X поддерживает readline и curses, и ваш новый двоичный файл sqlite3 будет реагировать, как и ожидалось, на стрелки, клавишу удаления и т. Д.

1 голос
/ 08 июня 2016

Я использую Linux Mint, и у меня возникла та же проблема sqlite3, но она была частично решена с помощью ответов здесь. Первоначально я использовал sqlite3, найденный в anaconda, который не имел поддержки readline.

После того, как я переименовал файл sqlite3 в anaconda, переустановка с использованием 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

с последующей переустановкой сделали свое дело.

1 голос
/ 14 сентября 2011

Вот два ответа на два вопроса:

  1. Я считаю, что с помощью клиента командной строки sqlite3 мои клавиши со стрелками работают без проблем.

  2. В вашем выражении INSERT есть две ошибки:

    • Не следует указывать значение для столбца AUTOINCREMENT.

    • Вы должны перечислить столбцы и порядок их отображения. Это требуется, когда у вас нет такого же количества значений, как у столбцов, но это хорошая практика, даже если вы это делаете, потому что последующие изменения в структуре таблицы могут изменить порядок или количество столбцов.

    • Кроме того, одинарные кавычки являются более стандартными в базах данных SQL. SQLite будет принимать двойные кавычки, некоторые другие программы не будут.

      INSERT INTO Resource (ResourceType) VALUES ('бритва')

1 голос
/ 14 сентября 2011

Первая проблема: ваша инструкция вставки содержит 2 поля, но ваша таблица имеет 3 поля, поэтому она неоднозначна. SQLite не может определить, какие поля вы хотите установить. Вторая проблема: не устанавливайте свой resourceID равным нулю, если вы хотите использовать автоинкремент.

Попробуйте это:

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

При этом для resourceID будет установлено следующее значение автоинкремента, а для userID - значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...