使用 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()