sqlalchemy orm关系的连接间问题

sqlalchemy orm关系的连接间问题,sqlalchemy,Sqlalchemy,我正在尝试创建一个具有连接之间的关系。下面是一个简短的例子,说明我正在尝试做什么: #!/usr/bin/env python import sqlalchemy as sa from sqlalchemy import orm from sqlalchemy.ext.declarative import declarative_base metadata = sa.MetaData() Base = declarative_base(metadata=metadata) engine =

我正在尝试创建一个具有连接之间的关系。下面是一个简短的例子,说明我正在尝试做什么:

#!/usr/bin/env python
import sqlalchemy as sa
from sqlalchemy import orm
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()
如果运行此操作,将出现以下错误:

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 ?

这个问题的答案是肯定的,但我不知道如何告诉它,

SQLAlchemy遍历条件以在其中查找本地-远程对来确定列和关系的基数。该算法仅适用于二进制运算符。解决您的问题的简单方法是使用两个运算符重写。而且,它们不是“相等”运算符,因此不能使用此关系来追加新地址,这就是为什么使用
viewonly=True

Network.addresses = orm.relation(Address,
    viewonly=True,
    primaryjoin=(
        (Address.ip_addr_db>=Network.ip_net_addr_db) &
        (Address.ip_addr_db<=Network.ip_broadcast_addr_db)
    ),
    foreign_keys=[Address.ip_addr_db]
)
Network.addresses=orm.relation(地址、,
viewonly=True,
初级连接=(
(Address.ip\u addr\u db>=Network.ip\u net\u addr\u db)&
(Address.ip_addr_db)