【发布时间】:2016-04-14 06:48:56
【问题描述】:
这是一个用于保存 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 的列规范中做到这一点?
或者作为一个替代的想法,我应该把 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')
【问题讨论】:
标签: python sqlalchemy