Skip to main content
ChartDB never stores or accesses your data - the import query only retrieves schema metadata.

Quick Start

1

Create New Diagram

  1. Click File > New in the ChartDB editor
  2. Select SQlite from the database options
2

Run Import Query

Execute the provided query using either:
  • Your database client (e.g., DBeaver, CLI command)
  • Direct SQlite connection
3

Import Results

  1. Copy the JSON output from the query
  2. Paste into ChartDB’s import field
  3. Click Import to generate your diagram

Import Methods

-- Regular SQlite Database Import Query
WITH fk_info AS (
SELECT
  json_group_array(
      json_object(
          'schema', '',  -- SQLite does not have schemas
          'table', m.name,
          'column', fk."from",
          'foreign_key_name',
              'fk_' || m.name || '_' || fk."from" || '_' || fk."table" || '_' || fk."to",  -- Generated foreign key name
          'reference_schema', '', -- SQLite does not have schemas
          'reference_table', fk."table",
          'reference_column', fk."to",
          'fk_def',
              'FOREIGN KEY (' || fk."from" || ') REFERENCES ' || fk."table" || '(' || fk."to" || ')' ||
              ' ON UPDATE ' || fk.on_update || ' ON DELETE ' || fk.on_delete
      )
  ) AS fk_metadata
FROM
  sqlite_master m
JOIN
  pragma_foreign_key_list(m.name) fk
ON
  m.type = 'table'
), pk_info AS (
SELECT
  json_group_array(
      json_object(
          'schema', '',  -- SQLite does not have schemas
          'table', pk.table_name,
          'field_count', pk.field_count,
          'column', pk.pk_column,
          'pk_def', 'PRIMARY KEY (' || pk.pk_column || ')'
      )
  ) AS pk_metadata
FROM
(
  SELECT
      m.name AS table_name,
      COUNT(p.name) AS field_count,  -- Count of primary key columns
      GROUP_CONCAT(p.name) AS pk_column  -- Concatenated list of primary key columns
  FROM
      sqlite_master m
  JOIN
      pragma_table_info(m.name) p
  ON
      m.type = 'table' AND p.pk > 0
  GROUP BY
      m.name
) pk
), indexes_metadata AS (
SELECT
  json_group_array(
      json_object(
          'schema', '',  -- SQLite does not have schemas
          'table', m.name,
          'name', idx.name,
          'column', ic.name,
          'index_type', 'B-TREE',  -- SQLite uses B-Trees for indexing
          'cardinality', '',  -- SQLite does not provide cardinality
          'size', '',  -- SQLite does not provide index size
          'unique', (CASE WHEN idx."unique" = 1 THEN 'true' ELSE 'false' END),
          'direction', '',  -- SQLite does not provide direction info
          'column_position', ic.seqno + 1  -- Adding 1 to convert from zero-based to one-based index
      )
  ) AS indexes_metadata
FROM
  sqlite_master m
JOIN
  pragma_index_list(m.name) idx
ON
  m.type = 'table'
JOIN
  pragma_index_info(idx.name) ic
), cols AS (
SELECT
  json_group_array(
      json_object(
          'schema', '',  -- SQLite does not have schemas
          'table', m.name,
          'name', p.name,
          'type',
              CASE
                  WHEN INSTR(LOWER(p.type), '(') > 0 THEN
                      SUBSTR(LOWER(p.type), 1, INSTR(LOWER(p.type), '(') - 1)
                  ELSE LOWER(p.type)
              END,
          'ordinal_position', p.cid,
          'nullable', (CASE WHEN p."notnull" = 0 THEN 'true' ELSE 'false' END),
          'collation', '',
          'character_maximum_length',
              CASE
                  WHEN LOWER(p.type) LIKE 'char%' OR LOWER(p.type) LIKE 'varchar%' THEN
                      CASE
                          WHEN INSTR(p.type, '(') > 0 THEN
                              REPLACE(SUBSTR(p.type, INSTR(p.type, '(') + 1, LENGTH(p.type) - INSTR(p.type, '(') - 1), ')', '')
                          ELSE 'null'
                      END
                  ELSE 'null'
              END,
          'precision',
          CASE
              WHEN LOWER(p.type) LIKE 'decimal%' OR LOWER(p.type) LIKE 'numeric%' THEN
                  CASE
                      WHEN instr(p.type, '(') > 0 THEN
                          json_object(
                              'precision', substr(p.type, instr(p.type, '(') + 1, instr(p.type, ',') - instr(p.type, '(') - 1),
                              'scale', substr(p.type, instr(p.type, ',') + 1, instr(p.type, ')') - instr(p.type, ',') - 1)
                          )
                      ELSE 'null'
                  END
              ELSE 'null'
          END,
          'default', COALESCE(REPLACE(p.dflt_value, '"', '\"'), '')
      )
  ) AS cols_metadata
FROM
  sqlite_master m
JOIN
  pragma_table_info(m.name) p
ON
  m.type in ('table', 'view')
), tbls AS (
SELECT
  json_group_array(
      json_object(
          'schema', '',  -- SQLite does not have schemas
          'table', m.name,
          'rows', -1,
          'type', 'table',
          'engine', '',  -- SQLite does not use storage engines
          'collation', ''  -- Collation information is not available
      )
  ) AS tbls_metadata
FROM
  sqlite_master m
WHERE
  m.type in ('table', 'view')
), views AS (
SELECT
  json_group_array(
      json_object(
          'schema', '',
          'view_name', m.name
      )
  ) AS views_metadata
FROM
  sqlite_master m
WHERE
  m.type = 'view'
)
SELECT
replace(replace(replace(
  json_object(
      'fk_info', (SELECT fk_metadata FROM fk_info),
      'pk_info', (SELECT pk_metadata FROM pk_info),
      'columns', (SELECT cols_metadata FROM cols),
      'indexes', (SELECT indexes_metadata FROM indexes_metadata),
      'tables', (SELECT tbls_metadata FROM tbls),
      'views', (SELECT views_metadata FROM views),
      'database_name', 'sqlite',
      'version', sqlite_version()
  ),
  '\"', '"'),'"[', '['), ']"', ']'
) AS metadata_json_to_import;

Troubleshooting

Common Issues Guide

Find solutions for frequently encountered import problems and their resolutions
I