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: 369
sqlalchemy
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