无法在链接表中创建数据

时间:2017-09-01 15:17:27

标签: python postgresql sqlalchemy

我在SQLAlchemy的postgres数据库中插入数据时遇到了一些麻烦。 我的架构非常简单:

它由表进程组成,它有两个属性( pk_process (PK)和版本)和一个表general_metadata两个属性( fk_process (PK和FK)和名称)。 这是代码:

import uuid

from sqlalchemy import Column, ForeignKey, Text, text, create_engine
from sqlalchemy.dialects.postgresql.base import UUID
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

CONNEXION_URL = 'postgresql://postgres:postgres@localhost/elsa_data_test'

engine = create_engine(CONNEXION_URL, echo=True)
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()
metadata = Base.metadata


class Process(Base):
    __tablename__ = 'process'

        pk_process = Column(UUID, primary_key=True)
        fk_person = Column(UUID, nullable=False)
        version = Column(Text, nullable=False)


class GeneralMetadata(Process):
    __tablename__ = 'general_metadata'

    fk_process = Column(ForeignKey('process.pk_process', ondelete='CASCADE', onupdate='CASCADE', match='FULL'),
                        primary_key=True)
    name = Column(Text, nullable=False)

    process = relationship("Process")


process = Process(pk_process=uuid.uuid4().hex, fk_person=uuid.uuid4().hex, version='V1')
session.add(process)

general_metadata = GeneralMetadata(process=process, name='meta_name')
# process.general_metadata = general_metadata          I also tried this

session.add(general_metadata)

session.commit()

我无法弄清楚为什么,但每当我尝试提交时,我得到:

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError)
ERREUR:  une valeur NULL viole la contrainte NOT NULL de la colonne « pk_process »
DETAIL:  La ligne en échec contient (null, null, null)
[SQL: 'INSERT INTO process (fk_person) VALUES (%(fk_person)s) RETURNING process.pk_process'] [parameters: {'fk_person': None}]

如果我评论创建并添加general_metadata的两行,则提交工作并创建一个进程实例。

它是否与我创建或关联对象的方式有关?

1 个答案:

答案 0 :(得分:1)

我终于理解了为什么我得到了这个错误。

我的GeneralMetadata类继承自Process而不是Base。

改变这一切解决了一切。