将postgres db模式转换为json格式

31moq8wy  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(248)

我正在寻找一种方法来转换一个postgres数据库模式到JSON格式的数据。
例如:

{"Table" : 
   {"name": "varchar(20)",
    "Age" : "int"
   },
}

有人能帮我吗?

6yjfywim

6yjfywim1#

下面是一个使用PHP的解决方案:

$conn = pg_connect("host={$host} port=5432 dbname={$db} user={$user} password={$pass}");

$sql = <<<SQL
SELECT tables.table_name, columns.column_name, columns.data_type, columns.udt_name
FROM information_schema.tables AS tables
    JOIN information_schema.columns AS columns
        ON tables.table_name = columns.table_name
WHERE tables.table_type = 'BASE TABLE'
AND tables.table_schema NOT IN
('pg_catalog', 'information_schema');
SQL;

$result = pg_query($conn, $sql);
$table_meta = new stdClass;
while ($row =  pg_fetch_object($result)) {
    if (!isset($table_meta->{$row->table_name})) $table_meta->{$row->table_name} = new stdClass;
    $table_meta->{$row->table_name}->{$row->column_name} = $row->udt_name;
}

$table_json = json_encode($table_meta);

echo $table_json;

这是我使用postgres 9.2.4所能得到的最接近的结果

select row_to_json(table_schema)
from (
    select t.table_name, array_agg( c ) as columns
    from information_schema.tables t
    inner join (
        select cl.table_name, cl.column_name, cl.udt_name
        from information_schema.columns cl
    ) c (table_name,column_name,udt_name) on c.table_name = t.table_name
    where t.table_type = 'BASE TABLE'
    AND t.table_schema NOT IN ('pg_catalog', 'information_schema')
    group by t.table_name
) table_schema;

结果并不漂亮:

{"table_name":"users","columns":[
    {"table_name":"users","column_name":"user_id","udt_name":"int4"},
    {"table_name":"users","column_name":"user_email","udt_name":"varchar"}
]}

postgres 9.3提供了比9.2更多的json函数。如果可能的话,升级并查看9.3 json function文档。如果不可能升级,我会用一个类似我之前发布的php代码的脚本来完成。

xjreopfe

xjreopfe2#

tbls主要是一个记录数据库的工具,但它也支持yaml输出,这使得它在代码生成等方面很有用(我在ts-sql-codegen中使用-一个用于类型安全数据库访问的代码生成器)。
输出格式类似于this
您可以直接使用yaml,也可以使用其他工具(如yq)将其转换为json

相关问题