Ответы пользователя по тегу SQLite
  • Выбрать последний месяц состоящий из слов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Можно сделать справочную таблицу, где название месяца будет первичным ключом, а номер его в отдельном поле. Выбирать из оригинальной таблицы с джойном и сортировкой как обычно.
    Ответ написан
    Комментировать
  • Как удалить данные из БД по данным из переменной?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    cur.execute("DELETE FROM USER WHERE username=?", get_user)

    Зачем методом тыка пытаться программировать? Надо изучать SQL и БД
    Ответ написан
    1 комментарий
  • Как загрузить большое количество данных в базу SQLite на React Native?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Добавьте в каждую таблицу поле с таймштампом и ставьте туда свежее значение при создании и каждом апдейте записи. Нужно сделать индекс на это поле, тогда выборка всех изменений в БД от конкретного момента (момента последней репликации) будет извлекаться практически мгновенно. Число запросов будет соответствовать числу таблиц в БД.
    Синхронизацию можно делать сколь угодно часто, поскольку изменившихся данных будет не много, а чаще всего их не будет вовсе. Выборка происходит по индексу, а значит очень быстро, особенно если ничего не изменилось.

    В локальной БД сохраняйте дату последней репликации в отдельной таблице.
    Имейте в виду, что обратная репликация из оффлайн БД в основную уже не будет такой простой. Во-первых нужно что-то придумывать с генерацией идентификаторов для новых записей. Возможно придётся переходить на 16-битные идентификаторы (GUID), чтобы они не пересекались с основной базой.
    Ещё нужно понимать, что в оффлайн режиме у вас может оказаться недостоверным время на локальной машине.
    Если на локальной машине есть доступ к GPS, то можно снизить число негативных последствий, но не предотвратить их вовсе.
    Если вам критично не перепутать время правки записей и первоисточник изменений из-за неточности локального времени, то тут надо будет предпринимать меры для решения этой проблемы, и, есть вероятность, что придётся идти на серьёзные компромиссы.
    Если у вас будет много локальных клиентов, которые будут работать в оффлайн-режиме, то ситуация усугубится многократно. Минимизируйте возможность правки общих данных клиентами из оффлайн-режима.

    Помните, что GPS сейчас не гарантирует достоверного времени на локальной машине, поскольку в некоторых регионах военное положение, а подразделения РЭБ в куче мест ставят помехи и искажают сигналы со спутников. Часы могут сильно врать.
    Ответ написан
    Комментировать
  • Как сделать запрос в sqlite?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    self.cursor.execute("SELECT * FROM table1 WHERE colum1 LIKE ?", (f'%{age}%',)).fetchmany(1)
    Ответ написан
    1 комментарий
  • Почему запрос по имени работает медленнее если заменить фамилию на %?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Так устроен индекс. Он строится в первую очередь по первым символам и в последнюю по последним.
    Если вы подменяете % начало, то индекс просто не будет работать.
    Разделите ФИО на отдельные компоненты и сделайте отдельный индекс для имени, тогжа ваш кейс будет быстрее работать.
    У вас же фактически происходит полный перебор базы без индекса.

    Для примера. Вот у вас есть больой алфавитный список людей. Найти в нем любого человека по тому, по чему список отсортирован - это тривиальная задача. Вы делите весь спислк пополам и мгновенно определяете в какой половине искомая строка. Потом делите оставшуюс половину и так далее. А теперь представьте, что ваш список осортирован по фамилии, а вам надо найти в нем Сигизмунда. Всех Сигизмундов. Сортировка по фамилии вам не поможет быстро искать. Нужна сортировка по имени. Для этого и делают отдельные индексы.
    Ответ написан
    3 комментария
  • Код почему то запускаеться 5 раз хотя такого не должно быть в чем может быть проблема?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что вас удивляет? Все работает как написано.
    SQL-запрос вернул 5 записей, вы перебираете их циклом, в котором при первом проходе выполняется некий код с инвентарем, а на остальных четырех проходах i=1 и срабатывает негативная ветка, где печатается символ нуля.
    Судя по тому, как вы неправильно пользуетесь шаблонной строкой и какой вопрос задаете, вы далеки от программирования. Надо подучиться питну и основам алгоритмизации.
    А еще так подставлять параметры в запрос опасно, нужно передавать их отдельно в execute.
    Ответ написан
    1 комментарий
  • Как получить последний элемент столбца?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    К соседнему ответу могу добавить.
    Если Id у вас формируется автоинкрементом, то можо ограничить выдачу select-запроса одним элементом и указать обратный порядок сортировки по нужному вам полю.
    Ответ написан
    Комментировать
  • Вопрос про sqlite?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    sqlite БД - это просто файл, чтобы подключиться к такой БД можно скачать его или примонтировать файловую систему сним к локальной, например, через SSH. В случае больших БД будут проблемы с производительностью. Если вам нужно делать это штатно, регулярно, в проде, да еще и с разных клиентов, то использовать надо какие-то другие БД, а не sqlite.
    Ответ написан
    3 комментария
  • Как из строки восстановить список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ещё можно сериализовать\десериализлвать этот список в \из json.
    huge_string = json.dumps(huge_list)
    restored_list = json.loads(huge_string)
    Ответ написан
    Комментировать
  • Как отсортировать по ORDER BY используя ещё и rowid?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если вам зачем-то нужен rowid, скорее всего вы делаете что-то не так. Для чего он вам нужен?
    В реляционных БД положение в таблице (не в выборке, а именно в таблице) ничего не значит. Вы не должны этим управлять и не за чем получать это положение. Уверен, есть другие способы достичь того, что вы там пытаетесь достичь. К примеру, если вам нужно узнать сколько пользователей имеют кэш меньше вашего, то так и запрашивайте:
    SELECT count(*) 
    FROM users u 
    WHERE u.cash < (SELECT cash FROM users WHERE id = :my_user_id)

    Если нужен какой-то рейтинг беднейших игроков до вас включительно, то можно использовать сортировку:
    SELECT u.id, u.cash 
    FROM users u 
    WHERE u.cash <= (SELECT cash FROM users WHERE id = :my_user_id)
    ORDER BY u.cash

    Очередность выборки по индексу одинаковых значений не гарантирована. Если нужна стабильност ьпорядка выборки, добавьте вторым параметром сортировки обычный уникальный идентификатор, тогда люди с одинаковым кэшем не будут от запроса к запросу меняться местами.
    Ответ написан
  • Как реализовать регистронезависимый поиск в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно, как быстрое решение, продублировать данные в таблице, обработав их снаружи преобразованием в upper case.
    Тогда вам придётся подавать на вход в запросы уже преобразованные (подготовленные под формат индекса) данные.

    А вот здесь есть статья о том как добавить collate для русского регистронезависимого сравнения.
    Ответ написан
  • Чем открыть большой sqlite-файл?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если делать запрос, то результат тот же.

    А какой запрос вы делаете? Добавьте в него конструкцию `LIMIT , ` и получайте данные порциями.
    Нужно посмотреть ещё ваш запрос. Вдруг там full join и всё, само собой, не помещается в память.
    Ответ написан