在 PostgreSQL 中基于 JSON 文件创建表
Posted
技术标签:
【中文标题】在 PostgreSQL 中基于 JSON 文件创建表【英文标题】:Create table based on JSON file in PostgreSQL 【发布时间】:2014-05-12 12:45:57 【问题描述】:我收到一些 JSON 格式的数据。我想将数据存储在数据库中(PSQL 9.1),但数据结构每天都在变化。
数据示例:
"No.":"1",
"Ticker":"A",
"Market Cap":"18468.13",
"P\/E":"25.53",
"Forward P\/E":"16.17",
"PEG":"2.69",
"P\/S":"2.72",
"P\/B":"3.39",
"P\/Cash":"6.74",
"P\/Free Cash Flow":"24.46",
"EPS growth this year":"-35.80%",
"EPS growth next year":"10.91%",
"EPS growth past 5 years":"2.30%",
"EPS growth next 5 years":"9.48%",
"Sales growth past 5 years":"3.30%",
"Price":"55.39",
"Change":"0.16%",
"Volume":"1287900",
"Dividend Yield":"0.96%",
"Return on Assets":"7.00%",
"Return on Equity":"14.20%",
"Return on Investment":"10.20%",
"Current Ratio":"3.30",
"Quick Ratio":"2.60",
"LT Debt\/Equity":"0.50",
"Total Debt\/Equity":"0.50",
"Gross Margin":"52.20%",
"Operating Margin":"15.70%",
"Profit Margin":"10.90%",
"Earnings Date":"5\/14\/2014 4:30:00 PM",
"Company":"Agilent Technologies Inc.",
"Sector":"Healthcare",
"Industry":"Medical Laboratories & Research",
"Country":"USA"
我想每天将所有收到的数据存储在新表中。创建与收到的 JSON 结构相同的新表的最简单方法是什么?
【问题讨论】:
为什么不直接存储 JSON? 我想稍后在该表上使用 sql 查询...每次解析 JSON 都太大了,我不能在 PSQL 中使用 json_enhancements,因为我有 9.1 似乎是升级到 9.3 的完美理由 - 尽管我认为您可以在 9.1 安装中安装 javascript (plv8js
) 并在 JavaScript 中构建一些函数来访问存储在 text
中的 JSON列。
你不能这样做。让我们假设提供的结构适用于今天。让我们假设明天会有一个新专栏。您将使用哪种类型的列?因为如果你今天想写一个脚本,你应该知道这一点。顺便说一句,如果您不想查询所有列,可以将最想要的字段拉到列中,并将整个响应存储为 text
(但只能在您的应用程序中使用)。
您可能需要编写一个简单的脚本来执行此操作,使用 Perl/Python/Ruby/whatever。
【参考方案1】:
问题可能来自正则表达式考试。 SQL Fiddle
create or replace function create_table_from_json(json text, tablename text)
returns void language plpgsql
as $$
begin
execute
replace(
replace(
regexp_replace(
json,
'("[^"]*"):("[^"]*")',
' \1 text', 'g'),
'',
format('create table %s (', tablename)),
'',
');');
end
$$;
create or replace function insert_from_json(json text, tablename text)
returns void language plpgsql
as $$
begin
execute
replace(
replace(
regexp_replace(
json,
'("[^"]*"):"([^"]*)"',
'''\2''', 'g'),
'',
format('insert into %s values (', tablename)),
'',
');');
end
$$;
【讨论】:
以上是关于在 PostgreSQL 中基于 JSON 文件创建表的主要内容,如果未能解决你的问题,请参考以下文章
加载 back.json 文件 PostgreSQL 时出现重复键问题