2017-09-01 4 views
0

J'ai des problèmes lors de l'insertion de données dans ma base de données postgres à partir de SQLAlchemy. Mon schéma est assez simple:Impossible de créer des données dans une table liée

Il est composé d'un processus tableau qui a deux attributs (pk_process (PK) et Version) et un general_metadata de table qui a également deux attributs (fk_process (PK et FK) et nom). Voici le code:

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() 

Je ne peux pas comprendre pourquoi, mais chaque fois que j'essaie de commettre je reçois:

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}] 

Si je commente les deux lignes qui crée et ajoute general_metadata, la validation des œuvres et un instance de processus est créée.

Est-ce quelque chose qui fonctionne dans la façon dont je crée ou associe des objets?

+1

Votre exemple d'utilisation et les détails de l'erreur se rapportent au fichier 'fk_person' qui n'est pas présent dans la définition de la table' Process'. Votre exemple est incomplet? –

+0

En effet ... j'ai minimisé mon exemple un peu trop. Je viens de l'éditer. Le problème est toujours le même. –

Répondre

1

J'ai finalement compris pourquoi j'ai eu cette erreur.

Ma classe GeneralMetadata hérite de Process et non de Base.

Modification de tout résolu.