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

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

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

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

Потому что иначе всё равно придётся разрешать конфликты записей. Например, в таблице X один пользователь добавил запись A с id=10, а другой независимо добавил запись B с id=10. Придётся одну перенумеровывать. А если у них ещё и связанные записи в других таблицах?
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Python
software engineer
sqlite это не база данных это библиотека, которая предоставляет sql интерфейс при работе с файлом. А множественный доступ на редактирование к одному и тому же файлу, пока не реализовали ни в одной операционной системе.
Следовательно нужно переделать софт на работу с настоящей базой данных. Либо самому написать сервис, который будет работать с sqlite в одиночку, принимая запросы от разных клиентов.
Ответ написан
firedragon
@firedragon
Senior .NET developer
Все описано в документации
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 . . .
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 180 000 до 250 000 ₽
БАНК УРАЛСИБ Москва
от 150 000 до 280 000 ₽
SpectrumData Екатеринбург
от 150 000 до 250 000 ₽
25 мая 2022, в 01:04
2000 руб./за проект
25 мая 2022, в 00:37
800 руб./за проект
25 мая 2022, в 00:26
5000 руб./за проект