由于外键将pandas数据框插入表时出错

时间:2018-07-23 07:22:05

标签: python postgresql sqlalchemy psycopg2

我正在执行一个非常简单的操作,即从处理它的一个表中获取值并将其加载到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)=(提莫西礼服,92002,ofirmev,名称)不是   存在于“实体”表中。

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

1 个答案:

答案 0 :(得分:1)

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

您有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