Ошибка «Не удается адаптировать тип» для атрибута внешнего ключа с помощью SQLAlchemy / PostGreSQL - PullRequest
1 голос
/ 28 октября 2010

У меня проблема с PostGreSQL 8.4 и отражением таблиц. Мой объект метаданных, кажется, в порядке (у него есть внешние ключи, первичные ключи, все столбцы и таблицы). Но когда я пытаюсь связать объект с другим через внешний ключ, я получаю: "sqlalchemy.exc.ProgrammingError: (ProgrammingError) не может адаптировать тип 'EventParameters' 'INSERT INTO event (".

Я использую SQLAlchemy 0.6.3 (psycopg2 2.2.1) и PostGreSQL 8.4.5

Вот мой код:


#! /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:toto@127.0.0.1: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()

и моя база данных:


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

Похоже, что SQLAlchemy не распознает атрибут "eventparametersid" как отношение ...

Заранее спасибо Фабьен

1 Ответ

1 голос
/ 29 октября 2010

Чтобы ваш код работал, вы должны изменить вызов mapper для класса Event, чтобы включить отображение между двумя классами

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

затем используйте этот столбец для назначения экземпляра EventParameters

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

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