使用 python 使用外键插入 Postgres table
inserting into Postgres table with a foreign key using python
我正在尝试使用 python (psycopg2) 将数据从 json 插入到我的 postgres table 中。
这个 json 很大,现在我想知道插入所有这些数据的正确方法是什么。
让我感到困难的是 table 引用了另一个 table。我想根据我的 json.
中的值之一引用 table 的 ID
我的问题详情:
CREATE TABLE market.entities (
id serial PRIMARY KEY,
code TEXT NOT null,
name TEXT NOT NULL,
country TEXT NOT null,
exchange TEXT,
currency_code TEXT NOT null,
"type" TEXT,
isin TEXT,
api_source int REFERENCES market.source_api(id) NOT null,
imported_at date NOT null
);
这个 table 实体已经填充了这样的数据:
id|code|name|country|exchange|currency_code|type|isin|api_source|imported_at
----------------------------------------------------------------------------
1|A|Agilent Technologies, Inc|USA|NYSE|USD|Common Stock|US00846U1016|1|2021-07-17
----------------------------------------------------------------------------
我想用 json 中的数据填充的 table:
CREATE TABLE IF NOT EXISTS market.end_of_days(
id serial PRIMARY KEY,
entity_id int REFERENCES market.entities(id),
import_type int REFERENCES market.import_types(id),
source_api int REFERENCES market.source_api(id),
date date,
open int,
high int,
low int,
close int,
adjusted_close int,
volume int,
imported_at date,
UNIQUE (date, source_api, entity_id)
);
json的一部分:
[
{
"code": "ONTRF",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 0.1393,
"high": 0.1393,
"low": 0.1393,
"close": 0.1393,
"adjusted_close": 0.1393,
"volume": 0
},
{
"code": "ONTX",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 5.72,
"high": 6.19,
"low": 5.7,
"close": 6.07,
"adjusted_close": 6.07,
"volume": 324700
}
]
json 中的“代码”键已经位于实体 table 中,因此在 end_of_days.entity_id 中我想引用实体 [=44] 中的 ID =] 基于此“代码”值。
psycopg2 有一个很好的解决方案吗?通常我只会使用 psycopg2.extras.execute_values() 但我认为这在这种特定情况下不起作用。
(P.S。这是我第一次在 Whosebug 上发帖,所以如果我需要指定一些内容,或者以不同的方式构建我的问题,请告诉我。)
这并不是一个真正的答案,而是一个可能的处理方法的建议。在弄清楚这一点的同时,将 JSON 数据分成更小的块以用于测试目的。想法:
创建一个暂存 table,您可以将 INSERT
文件中的 JSON 直接 table 中的 jsonb
字段。使用'Table 9.47. JSON Processing Functions'中的JSON capabilities of psycopg2
. Then you could use the JSON processing functions from here JSON Function修改移动数据到market.end_of_days
更新
我发现做这样的事情更容易:
CREATE TABLE symbol_import
(code varchar,
exchange_short_name varchar,
"date" date,
open numeric,
high numeric,
low numeric,
close numeric,
adjusted_close numeric,
volume numeric);
import json
import psycopg2
from psycopg2.extras import execute_batch
json_val = """[
{
"code": "ONTRF",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 0.1393,
"high": 0.1393,
"low": 0.1393,
"close": 0.1393,
"adjusted_close": 0.1393,
"volume": 0
},
{
"code": "ONTX",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 5.72,
"high": 6.19,
"low": 5.7,
"close": 6.07,
"adjusted_close": 6.07,
"volume": 324700
}
]"""
data_dict = json.loads(json_val)
con = psycopg2.connect("...")
cur = con.cursor()
data_insert = "insert into symbol_import values(%(code)s, %(exchange_short_name)s, %(date)s, %(open)s, %(high)s, %(low)s, %(close)s, %(adjusted_close)s, %(volume)s)"
execute_batch(cur, data_insert, data_dict)
con.commit()
我正在尝试使用 python (psycopg2) 将数据从 json 插入到我的 postgres table 中。 这个 json 很大,现在我想知道插入所有这些数据的正确方法是什么。
让我感到困难的是 table 引用了另一个 table。我想根据我的 json.
中的值之一引用 table 的 ID我的问题详情:
CREATE TABLE market.entities (
id serial PRIMARY KEY,
code TEXT NOT null,
name TEXT NOT NULL,
country TEXT NOT null,
exchange TEXT,
currency_code TEXT NOT null,
"type" TEXT,
isin TEXT,
api_source int REFERENCES market.source_api(id) NOT null,
imported_at date NOT null
);
这个 table 实体已经填充了这样的数据:
id|code|name|country|exchange|currency_code|type|isin|api_source|imported_at
----------------------------------------------------------------------------
1|A|Agilent Technologies, Inc|USA|NYSE|USD|Common Stock|US00846U1016|1|2021-07-17
----------------------------------------------------------------------------
我想用 json 中的数据填充的 table:
CREATE TABLE IF NOT EXISTS market.end_of_days(
id serial PRIMARY KEY,
entity_id int REFERENCES market.entities(id),
import_type int REFERENCES market.import_types(id),
source_api int REFERENCES market.source_api(id),
date date,
open int,
high int,
low int,
close int,
adjusted_close int,
volume int,
imported_at date,
UNIQUE (date, source_api, entity_id)
);
json的一部分:
[
{
"code": "ONTRF",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 0.1393,
"high": 0.1393,
"low": 0.1393,
"close": 0.1393,
"adjusted_close": 0.1393,
"volume": 0
},
{
"code": "ONTX",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 5.72,
"high": 6.19,
"low": 5.7,
"close": 6.07,
"adjusted_close": 6.07,
"volume": 324700
}
]
json 中的“代码”键已经位于实体 table 中,因此在 end_of_days.entity_id 中我想引用实体 [=44] 中的 ID =] 基于此“代码”值。
psycopg2 有一个很好的解决方案吗?通常我只会使用 psycopg2.extras.execute_values() 但我认为这在这种特定情况下不起作用。
(P.S。这是我第一次在 Whosebug 上发帖,所以如果我需要指定一些内容,或者以不同的方式构建我的问题,请告诉我。)
这并不是一个真正的答案,而是一个可能的处理方法的建议。在弄清楚这一点的同时,将 JSON 数据分成更小的块以用于测试目的。想法:
创建一个暂存 table,您可以将 INSERT
文件中的 JSON 直接 table 中的 jsonb
字段。使用'Table 9.47. JSON Processing Functions'中的JSON capabilities of psycopg2
. Then you could use the JSON processing functions from here JSON Function修改移动数据到market.end_of_days
更新
我发现做这样的事情更容易:
CREATE TABLE symbol_import
(code varchar,
exchange_short_name varchar,
"date" date,
open numeric,
high numeric,
low numeric,
close numeric,
adjusted_close numeric,
volume numeric);
import json
import psycopg2
from psycopg2.extras import execute_batch
json_val = """[
{
"code": "ONTRF",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 0.1393,
"high": 0.1393,
"low": 0.1393,
"close": 0.1393,
"adjusted_close": 0.1393,
"volume": 0
},
{
"code": "ONTX",
"exchange_short_name": "US",
"date": "2021-07-08",
"open": 5.72,
"high": 6.19,
"low": 5.7,
"close": 6.07,
"adjusted_close": 6.07,
"volume": 324700
}
]"""
data_dict = json.loads(json_val)
con = psycopg2.connect("...")
cur = con.cursor()
data_insert = "insert into symbol_import values(%(code)s, %(exchange_short_name)s, %(date)s, %(open)s, %(high)s, %(low)s, %(close)s, %(adjusted_close)s, %(volume)s)"
execute_batch(cur, data_insert, data_dict)
con.commit()