先放一小段代码
class reload_system_log(Base): #重装系统日志表
__tablename__ = "reload_system_log"
id = Column(Integer,primary_key=True)
odd_numbers = Column(String(50),nullable=False)
key = Column(String(32))
ip = Column(String(15))
sn = Column(String(32))
reloadid = Column(String(32))
producerName = Column(String(32))
current_state = Column(String(20))
execution = Column(String(20))
execution_return = Column(String(20))
execution_time = Column(DateTime,default=datetime.now)
def __repr__(self):
return "{odd_numbers:%s,ip:%s,}" %(self.odd_numbers,self.ip)
def log_db(**kwargs):
print kwargs
selecturi = []
if 'ip' in kwargs:
selecturi.append(reload_system_log.ip == kwargs['ip'])
if 'odd_numbers' in kwargs:
selecturi.append(reload_system_log.odd_numbers == kwargs['odd_numbers'])
if 'current_state' in kwargs:
selecturi.append(reload_system_log.current_state == kwargs['current_state'])
if 'execution' in kwargs:
selecturi.append(reload_system_log.execution == kwargs['execution'])
def select(args):
select_ip = session.query(reload_system_log).filter(
*args
).all()
return select_ip
if selecturi:
select(selecturi)
被这问题困扰了半个多小时,问了下大神一个*args就搞定了
问题如下:
一个数据库查询的需求,需要匹配多个字段,且这几个字段根据业务逻辑进行输入,即有可能是传入一个也可能是传入4个,我们对传入正确的值进行判定,并调用数据库orm创建该字段的对象,然后抛到列表中,酱汁我们就获取到了所有正确的参数的orm对象。
那么问题来了,我们如何把这个列表中的所有参数按照orm要求的where条件传入呢?
也就是这段
正常的查询请求应该是酱汁的
select_ip = session.query(reload_system_log).filter(
reload_system_log.ip == kwargs['ip'],
reload_system_log.odd_numbers == kwargs['odd_numbers'],
).all()
但是由于我们要对传入值做判定,所以要把列表中的对象转换成 对象1,对象2,这样的字段传入到orm查询请求中。
想过将列表中的对象通过for出来,然后格式化到一个变量上,毫无疑问失败了
一个变量仅可以绑定一个对象,或字符串,数字啥的,但是我们这个是多个对象,行不通的,大伙可以试试
最终问大神后说你单独写个函数,然后用*args直接解析传入的列表就可以把列表中的内容拆分成 对象1,对象2,这样的了,试了一把 果然ok
对于args的使用,可以看下这篇文章,例子很简单,理解很容易
http://python.jobbole.com/83476/
网友评论