这是一个小表,用于以起始地址,结束地址和范围内的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')