Problem with between join for sqlalchemy orm relation.

Posted by Gary van der Merwe on Stack Overflow See other posts from Stack Overflow or by Gary van der Merwe
Published on 2010-04-13T07:28:13Z Indexed on 2010/04/13 7:32 UTC
Read the original article Hit count: 366

Filed under:

I'm trying to create a relation that has a between join. Here is a shortish example of what I'm trying to do:

#!/usr/bin/env python
import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy.engine.base import Engine
from sqlalchemy.ext.declarative import declarative_base


metadata = sa.MetaData()
Base = declarative_base(metadata=metadata)

engine = sa.create_engine('sqlite:///:memory:')

class Network(Base):
    __tablename__ =  "network"
    id = sa.Column(sa.Integer, primary_key=True)
    ip_net_addr_db = sa.Column('ip_net_addr', sa.Integer, index=True)
    ip_broadcast_addr_db = sa.Column('ip_broadcast_addr', sa.Integer, index=True)
    # This can be determined from the net address and the net mask, but we store
    # it in the db so that we can join with the address table.
    ip_net_mask_len = sa.Column(sa.SmallInteger)

class Address(Base):
    __tablename__ =  "address"
    ip_addr_db = sa.Column('ip_addr', sa.Integer, primary_key=True,
              index=True, unique=True)

Network.addresses = orm.relation(Address, 
    primaryjoin=Address.ip_addr_db.between(
                Network.ip_net_addr_db,
                Network.ip_broadcast_addr_db),
    foreign_keys=[Address.ip_addr_db])    

metadata.create_all(engine) 

Session = orm.sessionmaker(bind=engine)

Network()

I you run this, you get this error:

ArgumentError: Could not determine relation direction for primaryjoin condition 
'address.ip_addr BETWEEN network.ip_net_addr AND network.ip_broadcast_addr', on relation Network.addresses. 
Do the columns in 'foreign_keys' represent only the 'foreign' columns in this join condition ?

The answer to that question is Yes, but I cant figure out how to tell it that

© Stack Overflow or respective owner

Related posts about sqlalchemy