powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / malformed database schema с неизвестно откуда взятым значением
18 сообщений из 18, страница 1 из 1
malformed database schema с неизвестно откуда взятым значением
    #38946825
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть скрипт, который пишет лог-информацию в БД sqlite.

Структура базы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE TABLE "tasks" (
	`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	`rc`	INTEGER,
	`start`	INTEGER,
	`stop`	INTEGER,
	`logname`	TEXT,
	`ppid`	INTEGER,
	`maindata`	TEXT,
	`otherdata`	TEXT,
	`vars`	TEXT,
	`type`	INTEGER,
	`owner`	TEXT,
	`statuscode`	INTEGER
);
CREATE TABLE "steps" (
	`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	`taskid`	INTEGER NOT NULL,
	`stepNumber`	INTEGER NOT NULL,
	`stepName`	INTEGER,
	`start`	INTEGER,
	`stop`	INTEGER,
	`hostname`	TEXT,
	`data`	INTEGER,
	`status`	INTEGER
);



Периодически при добавлении данных (в steps) получаю ошибку (скрипт на python):

Код: plaintext
DatabaseError: malformed database schema (1) - near "1430198728": syntax error

При том что в инсерте и в БД у меня вообще нет такого числа (это timestamp, который может попасть либо в steps.start, либо в steps.stop, но я проверил вообще всю БД). Проблема возникает действительно эпизодически - в скрипте меняется только время запуска и остановки действия (эти таймстампы), чаще инсерт проходит успешно, но периодически получаю такую ошибку. Плюс при том, что вставляемые временные метки все время меняются, в ошибке всегда одно и то же число.

Подскажите, пожалуйста, куда смотреть?

И, да, использую WAL, но никаких старых журналов нет на диске. Перед воспроизведением ошибки удалил БД и даже ребутнулся - timestamp в ошибке изменился, но остальные симптому остались прежними.

Заранее спасибо за ваши советы!
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38946990
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alozovskoy,

Ты ведь используешь везде bind переменные и не формируешь insert как строку?
можешь залогировать и показать последний глючный insert
это можно сделать с помощью sqlite3_trace
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947000
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще проверь "холодную" базу на целостность через PRAGMA integrity_check;
в ней все хорошо?
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947072
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA,

Код: plaintext
1.
2.
sqlite> PRAGMA integrity_check;
ok

> Ты ведь используешь везде bind переменные и не формируешь insert как строку?

Я так понимаю что сама библиотека этим занимается, использую код такого вида

Код: plaintext
1.
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))

> можешь залогировать и показать последний глючный insert

Сейчас пытаюсь разобраться как это делается (с БД на "ой, простите"). Выполнение такого-же инсерта (на котором получаю ошибку), собранного "руками", происходит без проблем, но думаю что из-за того что и при работе скрипта я ошибку получаю не постоянно.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947164
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас поменял journal_mode с WAL на DELETE - ошибка поменялась на

Код: plaintext
database disk image is malformed

С sqlite вообще можно как-то без сложностей работать с несколькими одновременными изменяющими базу подключаениями?
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947288
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alozovskoy,

А у тебя эти подключения работают в разных процессах на одном хосте
или файл базы лежит там-же?
я в питоне никогда не работал с sqlite
в гугле пишут что у него какие-то грабли при работе в нитках
может ты на них и наступил?
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947296
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA, да, подключаюсь из разных процессов, БД лежит рядом.

Сейчас немного изменил свой скрипт - раньше у меня в начале работы создавалось соединение к БД, и потом по ходу выполнения скрипта это соединение использовалось; сейчас на каждое действие я открываю соединение, выполняю insert, комичу и закрываю - проблем нет. В принципе это не критично (завернул в функцию), но как-то не очень "красиво" получается. Но нагрузки большой не придвидится, так что пока отсавил так - в таком случае оно хотя бы работает.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947314
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alozovskoy,

Точно процессов а не ниток?
если у тебя много процессов будут звать функцию ты ведь получишь аналогичную проблему?
или ты в функции синхронизируешься?
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947324
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA, точно процессов. В функции синхронизации никакой нет - просто открываю базу и добавляю туда строку, коммичу и закрываю, но почему-то при "постоянном" соединении для процесса (скрипта) ошибки есть, а при открытии нового соединения каждый раз - все ОК.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947326
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alozovskoy,

А почему для лога выбрал эту бд?
ты ведь потом эти логи будешь чем-то смотреть и что-то в них искать
т.е. будет ~один читатель-админ и много писателей
а как будешь делать ротацию - новые файлы бд создаешь?
WAL вернул назад? :)
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947348
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA, WAL не стал возвращать, и без него вроде нормально (но вообще верну как только удостоверюсь что "решение" действительно помогло, сейчас "тестирую").

Логика такая - скрипты пишут данные в БД, все это через вебморду показывается пользователям. БД взял в основном из-за простоты выборок, а именно sqlite потому что без сервера работает (у меня "проект" на пару экранов кода, тащить сервер смысла нет).

С ротацией пока не придумал, скорее всего буду удалять старые записи раз в день\неделю (смотря какой размер БД будет).
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947489
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понимаю, постоянное соединение должно держаться не процессом, а именно нитью. Т.е. работать с соединением можно только в той нити, в которой соединение было открыто. Если, к примеру, Ваш процесс создаёт соединение в главном потоке, а лог пишет в дочернем - огребёте undefined behavior.

Кроме того, обратите внимание на threading mode , который устанавливается как при подключении к БД, так и зависит от опций, с которыми скомпилирована библиотека. Если с БД работают несколько процессов, он должен быть Multi-thread или Serialized.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947524
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В FAQ говорится, что могут быть проблемы с запиранием файла . Раз такое дело, можно попробовать сериализовать запись в БД вручную - через глобальный мьютекс, например.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947531
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatНасколько я понимаю, постоянное соединение должно держаться не процессом, а именно нитью. Т.е. работать с соединением можно только в той нити, в которой соединение было открыто. Если, к примеру, Ваш процесс создаёт соединение в главном потоке, а лог пишет в дочернем - огребёте undefined behavior.


хм. если Serialized разве будет UB?
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947561
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrCat, да, я читал про эту особенность, но у меня локальный диск и нормальная ФС, не должно быть проблем.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947570
alozovskoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrCat, у меня процесс по сути является нитью, то есть у меня однопоточное приложение, просто этих приложений запскаться может несколько одновременно.

> обратите внимание на threading mode

Посмотрю, спасибо вам!

А как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Я нахожу какие-то функции для C, но ни в python, ни в CLI я не могу получить доступ к этим опциям.
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947589
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alozovskoyА как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Я нахожу какие-то функции для C, но ни в python, ни в CLI я не могу получить доступ к этим опциям.

Скажи в SQL так PRAGMA compile_options;
...
Рейтинг: 0 / 0
malformed database schema с неизвестно откуда взятым значением
    #38947603
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм. если Serialized разве будет UB? Библиотека может не поддерживать сериализацию в принципе. Если при соединении такая библиотека не ругнётся - будут проблемы. Документация говорит, что сериализуется доступ к хэндлам соединения и запроса, но не понятно - используются глобальные мьютексы или локальные. Т.е. сериализация достигается в рамках одного или нескольких процессов? Сказано так: " the SQLite library will itself serialize access to database connections and prepared statements so that the application is free to use the same database connection or the same prepared statement in different threads at the same time.", т.е. речь идёт про одно приложение.

А как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД?
Да, можно
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / malformed database schema с неизвестно откуда взятым значением
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]