#bash #sqlite
#bash #sqlite
Вопрос:
Я пытаюсь импортировать список слов в таблицу в sqlite3 однако ошибка, с которой я сталкиваюсь, заключается в том, что она не вставляет слово в таблицу. Это ошибка, которую я получаю: 0.out: 1: ожидалось 2 столбца, но найдено 1 — заполнение остальных значением NULL
Я пробовал разные кавычки с переменными в create table; тот же результат. Также пробовал использовать разные вставки, такие как ЗАГРУЗКА ДАННЫХ в ФАЙЛ, только для получения ошибки:
Error: incomplete SQL: LOAD DATA INFILE 0.out INTO TABLE data0(word)
============================
sqlite3 $database.db << EOF
СОЗДАТЬ ТАБЛИЦУ $table (ЦЕЛОЕ ЧИСЛО ИДЕНТИФИКАТОРОВ, текстовое слово, ПЕРВИЧНЫЙ КЛЮЧ (идентификатор));
.импортировать таблицу $text $
.выход
EOF
============================
Текстовый файл содержит одно слово в строке
all
all-inspiring
И когда предполагается, что он будет работать правильно, вывод будет выглядеть следующим образом:
CREATE TABLE data0 (id integer,word text, primary key(id));
INSERT INTO data0 VALUES(1,'all');
INSERT INTO data0 VALUES(2,'all-inspiring');
etc.
Любая помощь будет высоко оценена.
Комментарии:
1. Ваша таблица состоит из двух столбцов. Что бы
.mode
вы ни использовали.import
, оно отображает только один столбец на каждую прочитанную запись, когда ему требуется одинаковое число как для таблицы, так и для записи. Отсюда предупреждение об использовании null для второго столбца.2. Если вы поменяете порядок столбцов id и word, вы все равно получите предупреждения, но это может работать так, как вы предполагаете.
3. Я пробовал поменять местами id и word, но результат по-прежнему тот же. На данный момент я не указал .mode при запуске этого, так какой режим вы бы предложили?
Ответ №1:
Этот подход может сработать :
#!/bin/bash
# Make this a script so that side-effects are effectively wrapped
# without giving an end-user any hassle
file="tempfile"
nl -s, -w1 filename >> "$file"
# Above step makes a temporary CSV file for import adding line numbers in the beginning
database="yourdbname"
table="yourtablename"
sqlite3 "$database" <<EOF
CREATE TABLE ${table}(id INTEGER PRIMARY KEY,word TEXT);
.mode csv
.import $file $table
.exit
EOF
rm "$file" #Delete the temporary file
Воспользуйтесь приведенным выше сценарием для раскрутки.
Проверьте
sqlite3 yourdbname <<EOF
.separator ,
select * from yourtablename;
.quit
EOF
Комментарии:
1. Спасибо sjsam! теперь результат получается именно таким, каким я его хочу!