Ответы пользователя по тегу SQLite
  • Как подставить значение в запрос sqlite?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Коробочное решение этой задачи называется SQL-Builder.

    Вот пример такого https://pypika.readthedocs.io/en/latest/2_tutorial...

    Использовать string interpolation здесь технически возможно, но не выдерживает критики
    по инфо-безопасности. Атака на инжекцию - это Top 10 уязвимостей софта в 21 веке.

    Вот об этом коллеги тоже пишут в ответах.
    Ответ написан
    Комментировать
  • Почему появляется ошибка Sqlite3.OperationalError: table users has no column named name?

    mayton2019
    @mayton2019
    Bigdata Engineer
    CREATE TABLE IF NOT EXISTS

    Скипает таблицу если она уже существует. Удали таблицу и тогда этот DDL отработает успешно.
    Ответ написан
  • Как сравнить структуры двух БД и создать скрипт миграции?

    mayton2019
    @mayton2019
    Bigdata Engineer
    быстро сравнить структуры БД и сделать скрипт, который приводит одну БД к структуре второй?

    В этой задаче - большое количество подводных камней. Например что делать если в двух БД есть одинаковые
    поля но имеющие разный тип (NUMERIC / VARCHAR). Дилемма... Что делать с исчезающими полями?
    Удалять? Дилемма...

    Я вообще не видел коробочных решение которые бы работали на "раз-два-три". Всегда есть нюансы.
    И есть conditions которые нужно вбить или вкрутить в эти решения.

    Написать скрипты которые извлекают метадату из одной и из другой БД не очень сложно. Но само практическое
    применение подобных скриптов - ограничено. И я думаю что это как раз та причина по которой коробочные
    "миграторы" не прижились.
    Ответ написан
    Комментировать
  • SQLite3 Как сделать таблицу с заранее переданным именем?

    mayton2019
    @mayton2019
    Bigdata Engineer
    У тебя нет выбора. Вариант раз - это интерполяция строк.
    'create table {} ....'.format(...)
    Вариант 2 - это конкатенация строк. Ну и проверь что строка состоит или alpha-num. И все.
    'create table ' + ..... + '.....'
    Ответ написан
    Комментировать
  • Как сделать через цепочку промисов последовательное выполнение операций в SQLite в node js?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Асинхронное программирование не обязано соотвествовать структурному. Ты предполагаешь
    что код исполняется сверху-вниз как в Pascal. Но он выполняется в соответствии с тем как
    срабатывают отложенные функции. Вот когда SELECT вернет данные - тогда и твой чек-поинт "1" будет
    напечатан.
    Ответ написан
  • SQLite Как выбрать записи, текстовое поле которых содержит подстроку, регистронезависимо?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если это одноразовая задача то поищи UPPER(value) LIKE '% ET%'

    Если искать надо будет много - то почитай про

    CREATE VIRTUAL TABLE .............. USING FTS5 ........
    Ответ написан
    Комментировать
  • Почему в SQLite при JOIN не дает значения из таблицы которую присоединяю?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мне кажется ты сам не понимаешь чего хочешь. Ты используешь LEFT-join.
    Это означает что ко всем строкам левой таблицы присоединяются те строки
    правой таблицы в которых найдено совпадение. Если совпадений нет - то
    правая часть выборки заполняется null. Так и должно быть.
    Ответ написан
    Комментировать
  • Как произвести сортировку в таблице SQLite3, после удаления записи?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Все базы данных хранят строки не так как Excel. Хранят как предписано в файловом
    формате для целевой DBMS. Когда удаляешь - обычно
    остаются дырки которые потом заполняются другими строками. Но это я упрощенно рассказываю.
    В реальности все еще сложнее. И есть процессы вакуума или другой релокации строк. И таблица
    может двигаться в памяти. Шаффлиться. Делиться на части. Кластеризоваться и т.п.

    Поэтому твоя хотелка достигается только с использованием order by.

    Все остальные способы не работают потому что язык SQL не дает никаких гарантий относительно
    физического упорядочивания строк.

    UPD: Для авто-нумерации https://stackoverflow.com/questions/16847574/how-t...
    Ответ написан
    Комментировать
  • Бот не вносит данные в таблицу sqlite, в чем может быть ошибка?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Эти два запроса - какая-то безсмыслица.

    SELECT Town FROM users WHERE user_id = (?)

    UPDATE users SET 'Town' = (?)

    Автор ты можешь прокомментировать словами что здесь происходит. Мне кажется что после обсуждения
    у тебя должны возникнуть другие вопросы.
    Ответ написан
    Комментировать
  • Как загрузить большое количество данных в базу SQLite на React Native?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я не встречал бесплатных механизмов репликации. Обычно для толстых коммерческих БД типа Oracle продавались коробочные продукты (Streams/GoldenGate) которые требовали знаний на уровне сертификации.

    Какие могут быть пути репликации в простом случае. Для таких детских бд как SQLits:

    1) Убить всё что локально и скачать все что есть в удаленной БД. На вид выглядит просто. Но неясно
    как часто это делать. Что будет триггером для такого события? Очевидно что должна быть золотая середина
    между потерпеть еще на старых данных или плюнуть и стартовать обновление которое на мобиле
    может затянуться на несколько минут. Вобщем пользователь страдает.

    2) Придумать механику инкрементального обновления. Для этого вам будет нужно добавить во все
    таблицы поле типа last_update_timestamp (вот примерно как Сергей выше писал) и обновлять только те
    записи которые старше максимальной даты которая уже есть. Кроме того надо во второй транзакции
    убить те записи которые были удалены в remote. Здесь - посложнее т.к. для убийства мы должны
    гарантировать существование PK для всех отслеживаемых таблиц. Мой опыт работы с БД показывает
    что там не то что PK там даже и нормализация не всегда делается. Все это как-то выглядит хрупко
    как хрустальная ваза и возможно потребует дополнительных индексов которые раньше не требовались
    для работы системы. Но при хорошем индексировании триггер можно дергать хоть каждые 15 минут.

    В более сложном варианте я-бы предложил реплицировать не SQL протокол а тело самой таблицы.
    И вести учет контрольных сумм блоков наподобие дерева Меркла. Но это решение настолько далеко
    уходит от React-Native приложух что я-бы сам себе не советовал. Тут еще могут быть трудности с native
    представлением SQLite. Неизвестно будет ли такая реплика бинарно-совместима.
    Но это будет хотя-бы быстрая реплика.
    Ответ написан
    Комментировать
  • Почему при выборке элементов SQLite в Android studio суммируемые числа округляются до целого?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Надо сменить тип данных с TEXT на NUMBER. Тогда суммирование будет точнее. По крайней мере я проверил вот так.

    sqlite> create table test(n number(2,3))
       ...> ;
    sqlite> insert into test values(16.30);
    sqlite>
    sqlite> select typeof(n) from test;
    real
    sqlite>
    sqlite> insert into test values(19.11);
    sqlite>
    sqlite> select total(n) from test;
    35.41
    sqlite> select sum(n) from test;
    35.41
    Ответ написан
    Комментировать
  • Почему функция count() увеличивает время запроса в 5 раз?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот эти две вьюшки можно заменить на одну.

    t2 AS (
        SELECT id
          FROM books
         WHERE dateYearPublished IN (2000) 
    ),
    t3 AS (
        SELECT id
          FROM books
         WHERE pagesCount BETWEEN 200 AND 1000
    ),


    что-то вроде

    tbooks AS (
        SELECT id
          FROM books
         WHERE dateYearPublished IN (2000) and pagesCount BETWEEN 200 AND 1000 
    )


    Ну и count каждый раз считать не надо. Как-то кешируй там результат.

    Очень часто новичкам нужен не count а exist хотя-бы одной строки. А это другой вид запросов.
    И его использовать выгоднее чем count.
    Ответ написан
    Комментировать
  • Как организовать хранение данных ингредиентов в базе рецептов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку нет никаких больше требований. У нас имеется типичная документно-ориентированная БД.
    Рецепты. Ингредиенты не специфицированы. Могут быть любые.

    Лучше всего здесь подходит MongoDb. И поиск по ингредиентам нормально сработает.
    Одна таблица. Просто и изящно.
    Ответ написан
  • Почему в SQLiteStudio так мало типов данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На сайте sqlite https://www.sqlite.org/datatype3.html перечислено действительно 5 storage classes. Насколько я понимаю создатели решили что эти storage classes являются как-бы супер-типами для всех прочих типов данных.
    Прочие типы данных как-бы конкретизируют эти storage classes.

    Почему студия показывает только эти - чорт его знает. Но разве это вас ограничивает в написании своего ddl ?

    Вам еще повезло что вы не работаете с HBase например. Там вообще все типы данных - это byte_array и вот что хочешь то и делай. По сути разработчику самому предлагают вводить понятие типа данны и механики сериализации-десериализации.
    Ответ написан
    Комментировать
  • Как ускорить запись в базу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут скорее всего ничего нельзя сделать. Судя по всему используется Django ORM.
    А любые ORM библиотеки не подходят для массовой загрузки-выгрузки.
    Надо просто отказаться от ORM и работать на уровне БД (Mongo/MySQL)
    их собственными средствами пакетной загрузки.
    Ответ написан
  • Ошибка: sqlite3.OperationalError: no such column: telegram_id: Как исправить?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Добавь новую колонку telegram_id.

    А этот код скорее всего не работает
    CREATE TABLE IF NOT EXISTS users
    потому что он опционален.

    Ты сам себя перехитрил :)
    Ответ написан
    Комментировать
  • Как присвоить несколько элементов в одной ячейки SQLite3?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Согласно законам нормализации в самой первой нормальной форме 1НФ требуется чтобы все данные лежали
    в таблице и ячейчки содержали атомарные значения. Тоесть списки - нельзя. Иначе такая таблица
    не признается реляционной и делать с ней реляционные действия невозможно.

    Попробуй разбить свою таблицу на две. Пользователи. И id_пользователей.
    Ответ написан
  • Почему падает no such column?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Эта команда - опциональная.
    CREATE TABLE IF NOT EXISTS users
    тоесть она могла и не выполнятся. А если она не выполнялась - то очевидно что существует другая таблица users.

    Давайте смотреть что в этой другой таблице. Автор неужели ты не мог логгирование добавить? Этож просто. Хоть бы знали работал ddl или нет.
    Ответ написан
    Комментировать
  • Как организовать внос данных в базу данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сколько работаю с БД - впервые слышу глагол "внос". Слышал: загрузка, input, ingestion, migration, load, pull.

    Ладно. Вобщем ты конено тег не поставил БД. В классическом SQL я не помню такой команды. Но в Postgres есть
    insert ... on conflict ...
    где ты указываешь что делать если ключик уже есть.

    В Oracle можно сделать как-то так
    merge into .... using dual on (key = key)
             when not matched then insert (...) values (...)
                 when matched then update set ....;


    И возможно в современных SQL/Nosql системах уже UPSERT поддерживается нативно.
    Ответ написан