Retrieve SQL database schemas as an array

Oct 27, 2025, 9:40:10 AM

SQL queries for retrieving your database schema.

Table of contents

Introduction

It is recommended to include your database schema when using the AI-powered SQL generator (text-to-SQL) and the best format to retrieve the database schema in is as an array. Including the database schema ensures not only that the SQL generations are much more accurate, but also that you can include much larger database schemas without confusing AI. To get the database schema as an array simply run the query and include the outputted array as dataSource. Below you get get the query for your database engine.

PostgreSQL

SELECT
  json_agg(
    json_build_object(
      'table',
      cols.table_name,
      'column',
      cols.column_name,
      'type',
      cols.data_type,
      'references',
      CASE
        WHEN ccu.table_name IS NOT NULL THEN ccu.table_name || '.' || ccu.column_name
        ELSE NULL
      END
    )
    ORDER BY
      cols.table_name
  ) AS schema_json
FROM
  information_schema.columns AS cols
  LEFT JOIN information_schema.key_column_usage AS kcu ON kcu.table_schema = cols.table_schema
  AND kcu.table_name = cols.table_name
  AND kcu.column_name = cols.column_name
  LEFT JOIN information_schema.table_constraints AS tc ON tc.constraint_name = kcu.constraint_name
  AND tc.table_schema = kcu.table_schema
  AND tc.constraint_type = 'FOREIGN KEY'
  LEFT JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
  AND ccu.constraint_schema = tc.constraint_schema
WHERE
  cols.table_schema = current_schema();

MySQL

SELECT
  JSON_ARRAYAGG(
    JSON_OBJECT(
      'table',
      cols.TABLE_NAME,
      'column',
      cols.COLUMN_NAME,
      'type',
      cols.DATA_TYPE,
      'references',
      CASE
        WHEN kcu.REFERENCED_TABLE_NAME IS NOT NULL THEN CONCAT(
          kcu.REFERENCED_TABLE_NAME,
          '.',
          kcu.REFERENCED_COLUMN_NAME
        )
        ELSE NULL
      END
    )
  ) AS schema_json
FROM
  information_schema.COLUMNS AS cols
  JOIN information_schema.TABLES AS tbl ON tbl.TABLE_SCHEMA = cols.TABLE_SCHEMA
  AND tbl.TABLE_NAME = cols.TABLE_NAME
  LEFT JOIN information_schema.KEY_COLUMN_USAGE AS kcu ON kcu.TABLE_SCHEMA = cols.TABLE_SCHEMA
  AND kcu.TABLE_NAME = cols.TABLE_NAME
  AND kcu.COLUMN_NAME = cols.COLUMN_NAME
WHERE
  cols.TABLE_SCHEMA = DATABASE()
  AND tbl.TABLE_TYPE = 'BASE TABLE';

Microsoft SQL Server

SELECT
(
  SELECT
    cols.TABLE_NAME AS [table],
    cols.COLUMN_NAME AS [column],
    cols.DATA_TYPE AS [type],
    fk.relation AS [references]
  FROM INFORMATION_SCHEMA.COLUMNS AS cols
  OUTER APPLY (
    SELECT TOP 1
      rt.name + '.' + rc.name AS relation
    FROM sys.foreign_key_columns AS fkc
    INNER JOIN sys.tables AS rt
        ON fkc.referenced_object_id = rt.object_id
    INNER JOIN sys.columns AS rc
        ON fkc.referenced_object_id = rc.object_id
        AND fkc.referenced_column_id = rc.column_id
    WHERE fkc.parent_object_id = OBJECT_ID(QUOTENAME(cols.TABLE_SCHEMA) + '.' + QUOTENAME(cols.TABLE_NAME))
      AND COL_NAME(fkc.parent_object_id, fkc.parent_column_id) = cols.COLUMN_NAME
  ) AS fk
  WHERE cols.TABLE_CATALOG = DB_NAME()
  FOR JSON PATH
) AS schema_json;

Oracle PL/SQL

SELECT
  json_agg(
    json_build_object(
      'table',
      cols.table_name,
      'column',
      cols.column_name,
      'type',
      cols.data_type,
      'references',
      CASE
        WHEN ccu.table_name IS NOT NULL THEN ccu.table_name || '.' || ccu.column_name
        ELSE NULL
      END
    )
  ) AS schema_json
FROM
  information_schema.columns AS cols
  LEFT JOIN information_schema.key_column_usage AS kcu ON kcu.table_schema = cols.table_schema
  AND kcu.table_name = cols.table_name
  AND kcu.column_name = cols.column_name
  LEFT JOIN information_schema.table_constraints AS tc ON tc.constraint_name = kcu.constraint_name
  AND tc.table_schema = kcu.table_schema
  AND tc.constraint_type = 'FOREIGN KEY'
  LEFT JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
  AND ccu.constraint_schema = tc.constraint_schema
WHERE
  cols.table_schema = current_schema();

SQLite

SELECT
  json_group_array(
    json_object(
      'table',
      table_name,
      'column',
      column_name,
      'type',
      column_type,
      'references',
      (
        SELECT
          fk."table" || '.' || fk."to"
        FROM
          pragma_foreign_key_list (table_name) AS fk
        WHERE
          fk."from" = column_name
        LIMIT
          1
      )
    )
  ) AS schema_json
FROM
  (
    SELECT
      m.name AS table_name,
      ti.name AS column_name,
      ti.type AS column_type
    FROM
      sqlite_master m,
      pragma_table_info (m.name) ti
    WHERE
      m.type = 'table'
  ) AS columns;

BigQuery

Update your_dataset with your dataset name.

SELECT
  JSON_AGG (
    JSON_OBJECT (
      'table',
      cols.table_name,
      'column',
      cols.column_name,
      'type',
      cols.data_type,
      'references',
      IF(
        kcu.referenced_table_name IS NOT NULL,
        CONCAT(
          kcu.referenced_table_name,
          '.',
          kcu.referenced_column_name
        ),
        NULL
      )
    )
  ) AS schema_json
FROM
  `your_dataset.INFORMATION_SCHEMA.COLUMNS` AS cols -- REPLACE your_dataset
  LEFT JOIN `your_dataset.INFORMATION_SCHEMA.KEY_COLUMN_USAGE` AS kcu -- REPLACE your_dataset
  ON cols.table_name = kcu.table_name
  AND cols.column_name = kcu.column_name;

Snowflake

SELECT
  ARRAY_AGG(
    OBJECT_CONSTRUCT(
      'table',
      cols.table_name,
      'column',
      cols.column_name,
      'type',
      cols.data_type,
      'references',
      CASE
        WHEN ccu.table_name IS NOT NULL THEN ccu.table_name || '.' || ccu.column_name
        ELSE NULL
      END
    )
  ) AS schema_json
FROM
  information_schema.columns AS cols
  LEFT JOIN information_schema.key_column_usage AS kcu ON kcu.table_schema = cols.table_schema
  AND kcu.table_name = cols.table_name
  AND kcu.column_name = cols.column_name
  LEFT JOIN information_schema.table_constraints AS tc ON tc.constraint_name = kcu.constraint_name
  AND tc.table_schema = kcu.table_schema
  AND tc.constraint_type = 'FOREIGN KEY'
  LEFT JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
  AND ccu.constraint_schema = tc.constraint_schema
WHERE
  cols.table_schema = CURRENT_SCHEMA();

MongoDB

{"listCollections": 1, "nameOnly": true}