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, если ничего не было вставлено. Я что-то пропустил?

Ответы

Ответ 1

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

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

  • У вас есть две ошибки в инструкции INSERT:

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

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

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

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

Ответ 2

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

$ ldd $(which sqlite3)

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

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

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

Ответ 3

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

rlwrap sqlite3 database.db

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

sudo apt-get install rlwrap

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

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

Ответ 4

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

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

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

то вы можете скомпилировать его через терминал (cd в каталог, в который извлекаются tarball):

$ ./configure
$ make
$ sudo make install

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

Ответ 5

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

Попробуйте следующее:

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

Это установит для resourceID следующее значение автоинкремента и идентификатор пользователя по умолчанию.

Ответ 6

Я использую 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

а затем повторная установка сделала трюк.