首页 > 解决方案 > 由于外键,将 pandas 数据帧插入表时出错

问题描述

我正在执行一个非常简单的操作,即从一个处理它的表中获取值并将其加载到 Postgres 中的一个空表中。

第一个表具有以下结构:

CREATE TABLE public.entities
(
  canonical character varying(255) NOT NULL DEFAULT ''::character varying,
  db_id character varying(255) NOT NULL,
  code character varying(255),
  description character varying(4096),
  level character varying(255),
  class character varying(255) NOT NULL,
  model character varying(255) NOT NULL DEFAULT 'test'::character varying,
  variants text[],
  CONSTRAINT entities_pkey PRIMARY KEY (db_id, canonical, class, model)
)

我试图加载已处理数据的第二个表具有以下结构

CREATE TABLE public.entities_variants
(
  entitymodel_canonical character varying(255) NOT NULL,
  entitymodel_db_id character varying(255) NOT NULL,
  entitymodel_model character varying(255) NOT NULL,
  entitymodel_class character varying(255) NOT NULL,
  variants character varying(255),
  CONSTRAINT fk8g9miq5xcx1jtp85lysrkjhm FOREIGN KEY (entitymodel_canonical, entitymodel_db_id, entitymodel_model, entitymodel_class)
      REFERENCES public.entities (db_id, canonical, class, model) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

现在,当我尝试插入(按行或整个数据框)时,我收到完整性错误:

IntegrityError:在表“entities_variants”上插入或更新违反了外键约束“fk8g9miq5xcx1jtp85lysrkjhm” 详细信息:键(entitymodel_canonical,entitymodel_db_id,entitymodel_model,entitymodel_class)=(Timothy Dress,92002,ofirmev,名称)在表“entities”中不存在。

我已经确认该数据原样存在于第一个表中。

标签: pythonpostgresqlsqlalchemypsycopg2

解决方案


您定义外键的列顺序与您引用列的顺序不匹配。

你有entitymodel_canonical引用db_identitymodel_db_id引用canonical等。

我认为你的约束声明应该是:

CONSTRAINT fk8g9miq5xcx1jtp85lysrkjhm FOREIGN KEY (entitymodel_db_id ,entitymodel_canonical, entitymodel_class, entitymodel_model)
  REFERENCES public.entities (db_id, canonical, class, model) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION

推荐阅读