2017-09-01 53 views
0

我有一些麻煩從SQLAlchemy的postgres數據庫中插入數據。 我的模式很簡單:無法在鏈接表中創建數據

它是由一個表過程它有兩個屬性(pk_process(PK)和版本),並且具有同時兩個屬性(fk_process表general_metadata(由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:[email protected]/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

您的使用示例和錯誤詳細信息指的是'fk_person'字段,它不存在於'Process'表定義中。你的例子不完整嗎? –

+0

的確......我把我的例子簡化得太多了。我剛剛編輯它。問題仍然是一樣的。 –

回答

1

我終於明白了爲什麼我得到這個錯誤。

My GeneralMetadata類從Process繼承,而不是從Base繼承。

改變這個解決了一切。