我可以在SQLAlchemy中使用带参数的上下文相关函数吗?

时间:2016-04-13 21:53:21

标签: python sqlalchemy

这是一个小表,用于以起始地址,结束地址和范围内的IP数量的形式保存IP地址范围

class IpRange(Base):
    __tablename__ = 'ip_range'
    ip_range_id = Column(Integer, Sequence('ip_range_id_seq'), primary_key=True)
    start_ip = Column(String(15))
    end_ip = Column(String(15))
    num_ips = Column(Integer)

我喜欢做的是能够使用各种样式创建对象,让课程弄清楚如何填充自己的字段。

foo = IpRange(ip='192.168.0.1')
foo = IpRange(ip='192.168.0.0/24')
foo = IpRange(ip='192.168.0.0-192.168.0.255')

编写一个可以解析各种IP地址/范围符号的函数并不会太难:

def parseIp(desired_format):
    ... stuff to parse any valid IP address/network format ...
    if desired_format == 'start':
        return start_ip
    if desired_format == 'end':
        return end_ip
    if desired_format == 'num_ips':
        return num_ips

我希望我可以使用default方法为我的列获取每列所需的数据:

class IpRange(Base):
    __tablename__ = 'ip_range'
    ip_range_id = Column(Integer, Sequence('ip_range_id_seq'), primary_key=True)
    start_ip = Column(String(15), default=parseIp('start'))
    end_ip = Column(String(15), default=parseIp('end'))
    num_ips = Column(Integer, default=parseIp('num_ips')

但是,这不是有效的SQLAlchemy语法。文档提到context-sensitive default columns,但语法不允许将参数传递给函数。所以即使我可以用default=parseIp调用函数,我也无法告诉它我正在寻找什么样的返回值。

有没有办法在SQLAlchemy的Column规范中执行此操作?

或者作为另一种想法,我应该将parseIp变成一个帮助脚本,它只生成新的IpRange对象并将其返回给调用者吗?类似的东西:

def parseIp(ipstring):
    ... parse data ...
    return IpRange(start_ip=parsed_start_ip, end_ip=parsed_end_ip, num_ips=parsed_num_ips)

>>> ipobj = parseIp('192.168.0.0/24')

0 个答案:

没有答案