2010-10-28 17 views
1

J'ai rencontré un problème avec PostGreSQL 8.4 et la réflexion des tables. Mon objet de métadonnées semble correct (il contient des clés étrangères, des clés primaires, toutes les colonnes et tables). Mais quand j'essaie d'associer un objet à un autre via une clé étrangère, je reçois: "sqlalchemy.exc.ProgrammingError: (ProgrammingError) ne peut pas adapter le type 'EventParameters' 'INSERT INTO event (".Erreur "Impossible d'adapter le type" sur un attribut de clé étrangère avec SQLAlchemy/PostGreSQL

I « utilise SQLAlchemy 0.6.3 (psycopg2 2.2.1) et PostGreSQL 8.4.5

ici, mon code:


#! /usr/bin/env python 

from sqlalchemy import MetaData, create_engine 
from sqlalchemy.orm import mapper, sessionmaker 

class EventParameters(object): 
    pass 

class Event(object): 
    pass 

engine = create_engine('postgresql://postgres:[email protected]:5432/renass') 
metadata = MetaData() 
metadata.reflect(bind=engine) 
Session = sessionmaker(bind=engine) 
session = Session() 
mapper(EventParameters, metadata.tables['eventparameters']) 
mapper(Event, metadata.tables['event']) 

ep = EventParameters() 
ep.publicid = 'test' 

e = Event() 
e.publicid = 'test' 
e.eventparametersid=ep 

session.add(e) 
session.commit() 

et ma base de données:


CREATE TABLE EventParameters ( 
    id SERIAL PRIMARY KEY, 
    publicID varchar(255) UNIQUE NOT NULL, 
    description varchar(255), 
    creationInfo_agencyID varchar(64), 
    creationInfo_agencyURI varchar(255), 
    creationInfo_author varchar(128), 
    creationInfo_authorURI varchar(255), 
    creationInfo_creationTime time, 
    creationInfo_version varchar(64) 
); 

CREATE TABLE Event ( 
    id SERIAL PRIMARY KEY, 
    eventParametersID integer NOT NULL REFERENCES EventParameters(id), 
    publicID varchar(255) UNIQUE NOT NULL, 
    preferredOriginID integer, 
    preferredMagnitudeID integer, 
    preferredFocalMechanismID integer, 
    type EventType, 
    typeCertainty EventTypeCertainty, 
    creationInfo_agencyID varchar(64), 
    creationInfo_agencyURI varchar(255), 
    creationInfo_author varchar(128), 
    creationInfo_authorURI varchar(255), 
    creationInfo_creationTime time, 
    creationInfo_version varchar(64) 
); 

Il semble que SQLAlchemy don 't r ecognize l'attribut « eventparametersid » comme une relation ...

Merci à l'avance Fabien

Répondre

1

Pour que votre code de travail devrait changer l'invocation de mappeur pour la classe d'événements pour inclure la correspondance entre les deux classes

mapper(Event, metadata.tables['event'], properties={ 
    'eventparameters': relation(EventParameters) 
}) 

puis utilisez cette colonne pour assigner l'instance de EventParameters

ep = EventParameters() 
ep.publicid = 'test' 

e = Event() 
e.publicid = 'test' 
e.eventparameters = ep 
+0

Merci, je ne l'ai pas lu assez le docume ntation ... :) –