我在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
的两行,则提交工作并创建一个进程实例。
它是否与我创建或关联对象的方式有关?
答案 0 :(得分:1)
我终于理解了为什么我得到了这个错误。
我的GeneralMetadata类继承自Process而不是Base。
改变这一切解决了一切。