Задать вопрос
Lomonos1917
@Lomonos1917
Делаю IRE для предприятия с нуля.

Как синхронизировать два файла базы данных sqlite в приложении на python?

Имеется приложение на tkinter, которое будет установлено на несколько РС (рабочих станций). Приложение представляет из себя окно, подготовленное для определённого специалиста (инженера, механика, мастера ремонтной зоны). Все они работают с одним файлом (общим) базы данных sqlite - то есть через это приложение вводят и выводят информацию. Причем они должны работать с ней одновременно на протяжении рабочего дня. Только вот от множества запросов к одной базе с разных РС возникают и неминуемо возникнут ошибки. Решение у меня такое: оставить на каждой РС свой экземпляр файла БД, чтобы отдельный конкретный пользователь обращался именно к нему; общий файл подвесить в локальной сети организации; остаётся только синхронизировать узлы РС с общим узлом на локалке.

Собственно, вопрос: как синхронизировать узлы на РС с общим узлом на локалке?
  • Вопрос задан
  • 635 просмотров
Подписаться 4 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 4
Vindicar
@Vindicar
RTFM!
Сделать нормальный сервер БД вместо SQLite. Возьми MariaDB, или Postgre, или что угодно.

Потому что иначе всё равно придётся разрешать конфликты записей. Например, в таблице X один пользователь добавил запись A с id=10, а другой независимо добавил запись B с id=10. Придётся одну перенумеровывать. А если у них ещё и связанные записи в других таблицах?
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
sqlite это не база данных это библиотека, которая предоставляет sql интерфейс при работе с файлом. А множественный доступ на редактирование к одному и тому же файлу, пока не реализовали ни в одной операционной системе.
Следовательно нужно переделать софт на работу с настоящей базой данных. Либо самому написать сервис, который будет работать с sqlite в одиночку, принимая запросы от разных клиентов.
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Все описано в документации
https://www.sqlite.org/whentouse.html

По идее на малых нагрузках он должен отрабатывать нормально, но пишут во первых о возможных тормозах, и о возможном разрушении бд.

Ультимативный путь это поставить бд клиент серверную и переписать программу.
Менее ультимативный это создать lock файл и перед изменением данных проверять блокировку. Файл просто 0 длины.

FILE* f = fopen("myfile.txt", "w");
int result = flock(fileno(f)), LOCK_EX);

// . . . .
// Locked file in use 
// . . . .
int release = flock(f, LOCK_UN);  // Unlock the file . . .
Ответ написан
@mikryukovsl
Что то круто завернули - нет и всё, а это приложение которое liteSync, не ужели вруть?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы