PDA

Просмотр полной версии : Выборка из базы SQLite



Vos-svar
17.04.2025, 17:20
Добрый вечер. Подскажите пожалуйста, что я делаю не так.
На ПЛК200 лежит файл базы SQLite по вот такому пути:/home/root/CODESYS/otchet.db
Описание файла базы скрин 1 и 2.
83233 83234
Суть проблемы:
В терминальном доступе к ПЛК, ввожу команду: sqlite3 /home/root/CODESYS/otchet.db "SELECT * FROM otchet"
В ответ получаю выборку из базы.
Если попытаюсь отсортировать по 2 колонке, ввожу команду: sqlite3 /home/root/CODESYS/otchet.db "SELECT * FROM otchet WHERE "2"="OST""
В ответ получаю: Error: no such column: OST
скрин 3
83235

МихаилГл
17.04.2025, 17:27
Может чтото типа: otchet.2 = ...

PS А для текста не одинарные кавычки нужны?

Cs-Cs
17.04.2025, 19:04
Мысль от меня. Я могу быть не прав. Но попробую (так было в MySQL)
Обычно имена таблиц и колонок задаются в обратных апострофах.
А значения задаются в прямых апострофах.
А тут вообще вложенные кавычки: запрос в кавычках, и значения в нём в кавычках.
Кавычки экранируются через слеш.

То есть, записать надо так:
sqlite3 /home/root/CODESYS/otchet.db "SELECT * FROM `otchet` WHERE `2` = 'OST'"

EFrol
17.04.2025, 19:46
А что там на первой картинке?
CREATE TABLE "otchet" ("id" INTEGER ...
А дальше?

imaex
17.04.2025, 21:18
из базы.
Если попытаюсь отсортировать по 2 колонке, ввожу команду: sqlite3 /home/root/CODESYS/otchet.db "SELECT * FROM otchet WHERE "2"="OST""
83235

И где тут сортировка? Сортировка задаётся кляузой order by, а не where. Это раз. Вместо номера так-то положено имя столбца указывать. Это два.

Vos-svar
17.04.2025, 22:56
А что там на первой картинке?
CREATE TABLE "otchet" ("id" INTEGER ...
А дальше?

На первой картинке дано описание структуры таблицы.
1-й столбец с именем "id" тип integer
2-й столбец с именем "1" тип text
и так далее до
24-й столбец с именем "23" тип text

Vos-svar
17.04.2025, 23:14
Вот результат проверки разных вариантов написания
83243

Может быть есть ограничения на названия столбцов в таблице? Нельзя например именовать цифрами?

МихаилГл
18.04.2025, 02:36
Вот результат проверки разных вариантов написания
83243

Может быть есть ограничения на названия столбцов в таблице? Нельзя например именовать цифрами?

Только вариант otchet.2 = не попробовали. В MSSQL, например, надо перед любым запросом либо делать активной саму базу, либо обращаться к столбцам базы через точку. А насчет наименования столбцов цифрами даже не знаю, у вас же создание таблицы проканало, возможно это не запрещено. И только одинарные кавычки не дают никаких сообщений об ошибках. Мельком глянул как запросы where в mysql делаются, но чего то хорошего описания так и не нашел, кроме использования ' для текста.

PS Кстати да, двойные "", как говорили выше, могут неправильно пониматься. Это надо не в запросах к базе искать как писать, а к самой конструкции для команды sqlite3

PS2 Почему на select '2' from... вылезли двойки, а не 1, 2, 3...

EFrol
18.04.2025, 07:33
И еще для ознакомления Ключевые слова в SQLite (https://www.rldp.ru/sqlite/sqlite344/lang_keywords.html)
Похоже что либо [2] = "OST", либо `2` = "OST"
Одинарная или двойная ковычка не подходят.

imaex
18.04.2025, 07:48
sqlite3 /home/root/CODESYS/otchet.db "SELECT * FROM `otchet` WHERE `2` = 'OST'"

Наоборот.

SELECT * FROM otchet WHERE "2" = 'OST'

otchet не надо квотить никак

imaex
18.04.2025, 07:50
Может быть есть ограничения на названия столбцов в таблице? Нельзя например именовать цифрами?

Вообще-то есть. Имена должны начинаться с букв и не быть зарезервированными словами. Но, если очень хочется усложнить себе жизнь и потом позадавать глупые вопросы, то можно заключить такие имена в двойные кавычки.

imaex
18.04.2025, 07:53
PS2 Почему на select '2' from... вылезли двойки, а не 1, 2, 3...

Что просили, то и получили. Попросили константу в поле выборки - получили константу. Если хотели запросить значения колонки "2", то и нужно было бы писать

select "2" from...

Vos-svar
18.04.2025, 08:23
Вообще-то есть. Имена должны начинаться с букв и не быть зарезервированными словами. Но, если очень хочется усложнить себе жизнь и потом позадавать глупые вопросы, то можно заключить такие имена в двойные кавычки.

Какая то странная у вас манера общаться в оскорбительной форме.

Vos-svar
18.04.2025, 08:29
Проблема решилась переименовыванием нужных мне столбцов. Добавил к цифрам с левой стороны латинскую букву.
Что странно, я проверял правильность написания запросов в программе DB Browser for SQLite. В ней всё работало как задумывалось, с цифровыми именами столбцов.

imaex
18.04.2025, 08:46
Какая то странная у вас манера общаться в оскорбительной форме.

А в каком месте я Вас оскорбил? Или Вы считаете, что вопросы очень умные, если Вы даже с базовыми правилами, понятиями и синтаксисом не ознакомились?

EFrol
18.04.2025, 09:08
Проблема решилась переименовыванием нужных мне столбцов. Добавил к цифрам с левой стороны латинскую букву.
Что странно, я проверял правильность написания запросов в программе DB Browser for SQLite. В ней всё работало как задумывалось, с цифровыми именами столбцов.

А в нём нельзя посмотреть запрос в формате SQL?

Vos-svar
18.04.2025, 09:59
Вот скрин с программы
83253
Причем не важно в одинарных или двойных кавычках OST

Cs-Cs
18.04.2025, 10:28
Наоборот.

SELECT * FROM otchet WHERE "2" = 'OST'

otchet не надо квотить никак
Спрашиваю, чтобы научиться: это в SQLite так? А то в MySQL квотится всё.

imaex
18.04.2025, 10:28
Причем не важно в одинарных или двойных кавычках OST

Это не важно для DB Browser, наверное. А в sqlite3 Вы с двойными кавычками получали правильный ответ от сервера, что столбца с таким именем не существует. Я ни капли не удивлюсь, если этот самый DB Browser на лету подменяет двойные кавычки на правильные.
Если в этом самом SQLite есть системные представления, где можно посмотреть пользовательский запросы, то это утверждение легко проверить.

imaex
18.04.2025, 10:31
Спрашиваю, чтобы научиться: это в SQLite так? А то в MySQL квотится всё.

Понятия не имею - я в Oracle проверял. ;) А с SQLite и MySQL не сталкивался. А что в MySQL квотится всё - для меня лично странно.

МихаилГл
18.04.2025, 12:02
Что просили, то и получили. Попросили константу в поле выборки - получили константу. Если хотели запросить значения колонки "2", то и нужно было бы писать

select "2" from...

Ну сразу бросилось в глаза, что все двойки из всей базы начал дергать, вместо второго столбца.

И вообще в маразм впадаю, похоже. Зачем то полез в mysql, когда вопрос про sqlite...

BETEP
18.04.2025, 22:32
........Что странно, я проверял правильность написания запросов в программе DB Browser for SQLite. В ней всё работало как задумывалось, с цифровыми именами столбцов.
похожая тема
https://www.rusavtomatika.com/forum/viewtopic.php?f=1&t=999

Тупо в панеле движок БД старый, то что работает в DB Browser, не пашет на панеле. С ПЛК скорее всего та же история.
---------
Как у вас рука поднялась сделать имена столбцов не текстом, а цифрой?

CREATE TABLE "Products" ("Name" TEXT,"Date" TEXT,"Metal_mm" INT,"Correction" INT,"Oper_1" INT,"Oper_2" INT,"Oper_3" INT,"Oper_4" INT,"Oper_5" INT,"Oper_6" INT,"Oper_7" INT,"Oper_8" INT,"Oper_9" INT,"Oper_10" INT,"Oper_11" INT,"Oper_12" INT,"Oper_13" INT,"Oper_14" INT,"Oper_15" INT,"Oper_16" INT,"Oper_17" INT,"Oper_18" INT,"Oper_19" INT,"Oper_20" INT,"Angle_1" INT,"Angle_2" INT,"Angle_3" INT,"Angle_4" INT,"Angle_5" INT,"Angle_6" INT,"Angle_7" INT,"Angle_8" INT,"Angle_9" INT,"Angle_10" INT,"Angle_11" INT,"Angle_12" INT,"Angle_13" INT,"Angle_14" INT,"Angle_15" INT,"Angle_16" INT,"Angle_17" INT,"Angle_18" INT,"Angle_19" INT,"Angle_20" INT,"Width_1" INT,"Width_2" INT,"Width_3" INT,"Width_4" INT,"Width_5" INT,"Width_6" INT,"Width_7" INT,"Width_8" INT,"Width_9" INT,"Width_10" INT,"Width_11" INT,"Width_12" INT,"Width_13" INT,"Width_14" INT,"Width_15" INT,"Width_16" INT,"Width_17" INT,"Width_18" INT,"Width_19" INT,"Width_20" INT,"Pos1_1" INT,"Pos1_2" INT,"Pos1_3" INT,"Pos1_4" INT,"Pos1_5" INT,"Pos1_6" INT,"Pos1_7" INT,"Pos1_8" INT,"Pos1_9" INT,"Pos1_10" INT,"Pos1_11" INT,"Pos1_12" INT,"Pos1_13" INT,"Pos1_14" INT,"Pos1_15" INT,"Pos1_16" INT,"Pos1_17" INT,"Pos1_18" INT,"Pos1_19" INT,"Pos1_20" INT,"Pos2_1" INT,"Pos2_2" INT,"Pos2_3" INT,"Pos2_4" INT,"Pos2_5" INT,"Pos2_6" INT,"Pos2_7" INT,"Pos2_8" INT,"Pos2_9" INT,"Pos2_10" INT,"Pos2_11" INT,"Pos2_12" INT,"Pos2_13" INT,"Pos2_14" INT,"Pos2_15" INT,"Pos2_16" INT,"Pos2_17" INT,"Pos2_18" INT,"Pos2_19" INT,"Pos2_20" INT)

EFrol
19.04.2025, 10:36
Решил проверить:
83274
Сработало:
- с двойными кавычками;
- с квадратными скобками;
- с апострофами;

всё остальное не сработало!!!

capzap
19.04.2025, 14:50
Решил проверить:
83274
Сработало:
- с двойными кавычками;
- с квадратными скобками;
- с апострофами;

всё остальное не сработало!!!
Не это Вы ещё сперва в базу заходите, а потом уже команды выполняете, ТС же не стал заморачиваться и из командной строки Линукса пытается работать

Vos-svar
19.04.2025, 22:50
Я писал свой код основываясь на примере видеоролика "50. Работа с СУБД SQLite" на ютубе канал "CodesysOneLove". Команда запроса формируется в моей программе и только потом передается в линукс на исполнение. Как сделать по другому я не знаю. Если у вас есть возможность, поделитесь мыслями какие еще есть варианты?

Vos-svar
19.04.2025, 23:03
похожая тема
https://www.rusavtomatika.com/forum/viewtopic.php?f=1&t=999

Тупо в панеле движок БД старый, то что работает в DB Browser, не пашет на панеле. С ПЛК скорее всего та же история.
---------
Как у вас рука поднялась сделать имена столбцов не текстом, а цифрой?

CREATE TABLE "Products" ("Name" TEXT,"Date" TEXT,"Metal_mm" INT,"Correction" INT,"Oper_1" INT,"Oper_2" INT,"Oper_3" INT,"Oper_4" INT,"Oper_5" INT,"Oper_6" INT,"Oper_7" INT,"Oper_8" INT,"Oper_9" INT,"Oper_10" INT,"Oper_11" INT,"Oper_12" INT,"Oper_13" INT,"Oper_14" INT,"Oper_15" INT,"Oper_16" INT,"Oper_17" INT,"Oper_18" INT,"Oper_19" INT,"Oper_20" INT,"Angle_1" INT,"Angle_2" INT,"Angle_3" INT,"Angle_4" INT,"Angle_5" INT,"Angle_6" INT,"Angle_7" INT,"Angle_8" INT,"Angle_9" INT,"Angle_10" INT,"Angle_11" INT,"Angle_12" INT,"Angle_13" INT,"Angle_14" INT,"Angle_15" INT,"Angle_16" INT,"Angle_17" INT,"Angle_18" INT,"Angle_19" INT,"Angle_20" INT,"Width_1" INT,"Width_2" INT,"Width_3" INT,"Width_4" INT,"Width_5" INT,"Width_6" INT,"Width_7" INT,"Width_8" INT,"Width_9" INT,"Width_10" INT,"Width_11" INT,"Width_12" INT,"Width_13" INT,"Width_14" INT,"Width_15" INT,"Width_16" INT,"Width_17" INT,"Width_18" INT,"Width_19" INT,"Width_20" INT,"Pos1_1" INT,"Pos1_2" INT,"Pos1_3" INT,"Pos1_4" INT,"Pos1_5" INT,"Pos1_6" INT,"Pos1_7" INT,"Pos1_8" INT,"Pos1_9" INT,"Pos1_10" INT,"Pos1_11" INT,"Pos1_12" INT,"Pos1_13" INT,"Pos1_14" INT,"Pos1_15" INT,"Pos1_16" INT,"Pos1_17" INT,"Pos1_18" INT,"Pos1_19" INT,"Pos1_20" INT,"Pos2_1" INT,"Pos2_2" INT,"Pos2_3" INT,"Pos2_4" INT,"Pos2_5" INT,"Pos2_6" INT,"Pos2_7" INT,"Pos2_8" INT,"Pos2_9" INT,"Pos2_10" INT,"Pos2_11" INT,"Pos2_12" INT,"Pos2_13" INT,"Pos2_14" INT,"Pos2_15" INT,"Pos2_16" INT,"Pos2_17" INT,"Pos2_18" INT,"Pos2_19" INT,"Pos2_20" INT)

Название столбцов цифрами сделал для более коротких запросов. Для добавления и изменения строк в таблице это не мешало, а вот выборка по таким столбцам стала не возможной.

capzap
20.04.2025, 06:21
Если у вас есть возможность, поделитесь мыслями какие еще есть варианты?
Вы ведь уже решили проблему, если остался файл который не выводит выборку на запрос, выкладывайте здесь

МихаилГл
20.04.2025, 07:26
У ТС проблема не с sqlite, а с работой с этой базой через codesys, не забывайте. Поэтому он с ней так и работает, проверяет запросы, которые воспринимает кодесис.

©Я так думаю...

capzap
20.04.2025, 08:05
У ТС проблема не с sqlite, а с работой с этой базой через codesys, не забывайте. Поэтому он с ней так и работает, проверяет запросы, которые воспринимает кодесис.

©Я так думаю...

где хоть один скрин из КДС?
таблица заполняется из КДС, полагаю по примеру из видео по работе с базой, с ней проблем нет. Прежде чем загружать в проект выборку из базы, нужно потренироваться в консоли, об этом здесь и шла пока речь, путаница с кавычками была и мешали те кто не разбирается
Другие варианты вместо консоли, вот 83287. И если таблица заранее не известна, помогает команда sqlite3 otchet.db ".schema"

Vos-svar
21.04.2025, 09:52
Доброго дня всем!
Файл тестовой базы во вложении.
Я понял вашу идею capzap,

Vos-svar
21.04.2025, 09:59
таблица заполняется из КДС, полагаю по примеру из видео по работе с базой, с ней проблем нет. Прежде чем загружать в проект выборку из базы, нужно потренироваться в консоли, об этом здесь и шла пока речь, путаница с кавычками была [/B]
Да всё так. При этом когда я отправлял запросы с выборкой из КДС и в ответ ничего не получал, полез в консоль выяснять почему ответа нет. Поэтому все скрины из консоли ПЛК.

capzap
22.04.2025, 06:47
Файл тестовой базы во вложении.
в самом начале темы был правильный ответ 83322

TaPX
23.04.2025, 09:42
Доброе утро. ПЛК-200, нет связи с правой стороной входов-выходов, пишет "драйвер не найден". Единственное, что делал - привязывал в соотнесении булеву переменную на первый дискретный выход. Почему такое произошло и как это исправить?
8334983348

Евгений Кислов
23.04.2025, 09:44
Добрый день.
Судя по скриншоту - у вас версия таргет-файла в проекте не соответствует версии прошивки.
Напишите на support@owen.ru - посмотрим, в чем именно дело.