Почему нельзя создать поля типов Boolean или Date в Sqlite через DBeaver или SqliteStudio?
Добрый день коллеги,
строю базу данных Sqlite программно через flask или django, делаю в таблицах поля типа Boolean или Date, всё отлично билдится, БД создаётся. Открываю БД при помощи менеджеров таких как DBeaver или SqliteStudio, в таблицах показывает поля данных типов. Пытаюсь создать через менеджер поле подобного типа, у меня его просто нет в списке.
От сюда вопрос, как так происходит, что поля программно можно создать и работать с ними на живой БД, а через менеджеры создать нельзя?
Дополнительно:
Создаешь скорее всего через какой-то пакет, а там универсальные типы данных. И если база не поддерживает, то создается поле с ближайщим к нужному типу. Так и тут
- для Boolean скорее всего INTEGER со значением 1 или 0
- для Date строка с датой-временем
А при получение данных ORM(или что там у тебя) преобразует данные в нужный формат.
То есть в SQLite нет типов данных Boolean & Date. Поэтому DBeaver или SqliteStudio не позволяют такие создать.
- Я так и думал пока не открыл через драйвер Sqlite в менеджере и не увидел типы как я указал, если бы это были приколы ORM тогда я там увидел бы простейшие типы данных как вы и сказали, но нет типы именно те которые мной были указаны при создании) И здесь мне не понятно, если я нативно могу работать с этими типами данных, то почему я их не могу создать?
- Ivan, Что такое драйвер Sqlite в менеджере ?
Раз тебя мои слова не убедили, то мог бы просто поискать "sqlite типы данных". Вот одна из первых ссылок https://www.sqlite.org/datatype3.html
- Ivan, и изучи вот это https://stackoverflow.com/questions/843780/store-b...
- YepBro, Я вас прекрасно понимаю и документацию я читал и о типах данных я знаю, мне просто не понятно, если я через jdbc:sqlite в DBeaver или Sqlite studio вижу типы данных не свойственные этому виду БД, созданные мной через ORM, то значит они нативно работают в этой БД, но создать такие типы в этих менеджерах я не могу, хочу разобраться почему так, без иронии и сарказма!
- Ivan, и вот это
2.2. Date and Time Datatype
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
Applications can choose to store dates and times in any of these formats and freely convert between formats using the built-in date and time functions. - Ivan, выше ссылка на Stackoverflow. Там есть упоминание про декларирование типов данных с примером создания колонки типа Boolean. То есть можно объявлять свои типы, но надо понимать, что это только видимость, храниться все равно будет в тех типах, что доспустимы.
3.1. Determination Of Column Affinity
For tables not declared as STRICT, the affinity of a column is determined by the declared type of the column, according to the following rules in the order shown:If the declared type contains the string "INT" then it is assigned INTEGER affinity.
If the declared type of the column contains any of the strings "CHAR", "CLOB", or "TEXT" then that column has TEXT affinity. Notice that the type VARCHAR contains the string "CHAR" and is thus assigned TEXT affinity.
If the declared type for a column contains the string "BLOB" or if no type is specified then the column has affinity BLOB.
If the declared type for a column contains any of the strings "REAL", "FLOA", or "DOUB" then the column has REAL affinity.
Otherwise, the affinity is NUMERIC.
Note that the order of the rules for determining column affinity is important. A column whose declared type is "CHARINT" will match both rules 1 and 2 but the first rule takes precedence and so the column affinity will be INTEGER.
- YepBro, И здесь я вас понимаю, я создаю некую таблицу с несуществующими сущностями через некий сторонний инструмент, он мне их создает, но так чтобы было понятно только ему, почему тогда я через непосредственно драйвер БД вижу там не аналоги полей со схожими параметрами, а реально те типы которые были в них изначально мной при создании заложены?
Создавал Sqlalchemy Flask, просматриваю DBveaver.
- Ivan, тут, похоже, дело в том, как SQLite хранит типы. Детально его не изучал, но из использования слова “affinity” в описании типов предполагаю, что для таблиц, не объявленных как strict (это важно и упоминается в цитате YepBro), в определении таблицы внутри самого SQLite тип хранится в том виде, в каком он был объявлен, а правила сродства (affinity) действуют как вывод типов и применяются на лету при определении фактических типов.
Можно предположить, что ваши таблицы созданы ORM не как strict. Если, например, попробовать создать копию таблицы в режиме strict, у колонок будут уже фактические типы (не знаю, поддерживается ли такой синтаксис в SQLite, не проверял):
create strict table strict_article as select * from article
create strict table strict_article as select * from article
Могу, конечно, ошибаться, но это самое логичное объяснение.
- Freeman, спасибо за ответ, очень интересно, нужно глубже копнуть)
- Ivan, потому что движок sqlite хранит эту информацию внутри каких-то своих метаданных :)
- YepBro, Freeman, Ещё раз спасибо коллеги, смотреть нужно реализацию движка и более низкоуровневые материалы по БД иначе не разобраться)
Ответы:
Нет таких типов данных в этой БД!
- Да, я понимаю, отсюда и вопрос)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Создание полей типов Boolean или Date в SQLite через DBeaver или SQLiteStudio может вызывать некоторые проблемы из-за особенностей реализации этих типов данных в SQLite.
1. Boolean тип данных: SQLite не имеет отдельного типа данных для логических значений, таких как TRUE или FALSE. Вместо этого, обычно используется INTEGER тип данных с ограничением CHECK, чтобы ограничить значения поля только до 0 или 1. Поэтому, при создании поля типа Boolean через DBeaver или SQLiteStudio, вам может потребоваться явно указать тип INTEGER и добавить ограничение CHECK.
Пример создания поля типа Boolean в SQLite:
CREATE TABLE my_table ( id INTEGER PRIMARY KEY, is_active INTEGER CHECK (is_active IN (0, 1)) );
2. Date тип данных: SQLite не имеет отдельного типа данных для хранения даты и времени, как, например, в других СУБД. Вместо этого, обычно используется TEXT тип данных для хранения даты и времени в формате ISO8601. При создании поля типа Date через DBeaver или SQLiteStudio, вам также потребуется использовать TEXT тип данных.
Пример создания поля типа Date в SQLite:
CREATE TABLE my_table ( id INTEGER PRIMARY KEY, created_at TEXT );
Таким образом, чтобы успешно создать поля типов Boolean или Date в SQLite через DBeaver или SQLiteStudio, убедитесь, что вы используете соответствующие типы данных (INTEGER для Boolean и TEXT для Date) и добавляете необходимые ограничения (например, CHECK для Boolean).