Hi,

I have a problem with such program (available at
http://filip.math.uni.lodz.pl/relation_problem.py):

=========================================================================
 Fails with Python-2.5.4 and SQLAlchemy-0.5.5

import sqlalchemy
import sqlalchemy.ext.declarative

'''
This program fails with:
==================================================================
  File
"/usr/lib/python2.5/site-packages/SQLAlchemy-0.5.5-py2.5.egg/sqlalchemy/orm/properties.py",
 line 953, in _determine_direction
      "argument." % self)
      sqlalchemy.exc.ArgumentError: Can't determine relation direction
for relationship 'PhysObject.location' - foreign key columns are present
in both the parent and the child's mapped tables.  Specify
'foreign_keys' argument.
==================================================================

Note that this fails for PhysObject.location, but doesn't for
TefObject.creator which is practically identical.
I have tracked it down to Comparator._refers_to_parent_table().
For TefObject.Id and TefObject.creatorId (building relation
TefObject.creator) it returns true (same table),
but not for TefObject.Id and PhysObject.locationId (building relation
PhysObject.location).

'''

class TefDeclarativeMeta(sqlalchemy.ext.declarative.DeclarativeMeta):
    def __init__(cls, classname, bases, dict_):
        if '_decl_class_registry' in cls.__dict__:
            return type.__init__(cls, classname, bases, dict_)
        
        base = bases[0]
            
        cls.__tablename__ = cls.__name__

        if hasattr(base, 'Id'):
            cls.__mapper_args__ = {'inherit_condition': cls.Id ==
base.Id, 'polymorphic_identity': cls.__name__}
        
        sqlalchemy.ext.declarative._as_declarative(cls, classname,
dict_)
        
        return type.__init__(cls, classname, bases, dict_)

Base =
sqlalchemy.ext.declarative.declarative_base(metaclass=TefDeclarativeMeta, 
mapper=sqlalchemy.orm.mapper)

class TefObject(Base):
    Id = sqlalchemy.Column( sqlalchemy.types.Integer, primary_key=True,
autoincrement=True)
    objectType = sqlalchemy.Column( sqlalchemy.types.String(128),
nullable=False)
    creatorId = sqlalchemy.Column(sqlalchemy.types.Integer,
sqlalchemy.ForeignKey('User.Id', name = 'tefobject_user_fkey', use_alter
= True))
    __mapper_args__ = {'polymorphic_on': objectType}

class User(TefObject):
    Id = sqlalchemy.Column(sqlalchemy.types.Integer,
sqlalchemy.ForeignKey(TefObject.Id), primary_key=True)
    name = sqlalchemy.Column( sqlalchemy.types.String(128))

TefObject.creator = sqlalchemy.orm.relation(
    User,
    primaryjoin = TefObject.creatorId == User.Id,
    foreign_keys = [TefObject.creatorId],
    remote_side = [User.Id]
)


class PhysObject(TefObject):
    Id = sqlalchemy.Column(sqlalchemy.types.Integer,
sqlalchemy.ForeignKey(TefObject.Id), primary_key=True)
    barCode = sqlalchemy.Column( sqlalchemy.types.String(12),
nullable=False)
    locationId = sqlalchemy.Column(sqlalchemy.types.Integer,
sqlalchemy.ForeignKey('Location.Id', name = 'physobject_location_fkey',
use_alter = True))

class Location(PhysObject):
    Id = sqlalchemy.Column(sqlalchemy.types.Integer,
sqlalchemy.ForeignKey(PhysObject.Id), primary_key=True)
    description = sqlalchemy.Column( sqlalchemy.types.String(128))


PhysObject.location = sqlalchemy.orm.relation(
    Location,
    primaryjoin = PhysObject.locationId == Location.Id,
    foreign_keys = [PhysObject.locationId],
    remote_side = [Location.Id]
)

joe = User(name = 'Joe')

stuff = TefObject(creator = joe)

room = Location(description = 'room 1', barCode = '1234')

desk = PhysObject(barCode='555', location = room)
=========================================================================

Is it my mistake or a bug in SQLAlchemy?


Filip Zyzniewski


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to