args sqlalchemy查询参数传递

先放一小段代码

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/

你可能感兴趣的:(args sqlalchemy查询参数传递)