先放一小段代碼
class reload_system_log(Base): #重裝系統(tǒng)日志表
__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)
被這問題困擾了半個多小時(shí),問了下大神一個*args就搞定了
問題如下:
一個數(shù)據(jù)庫查詢的需求饱苟,需要匹配多個字段葬荷,且這幾個字段根據(jù)業(yè)務(wù)邏輯進(jìn)行輸入喂窟,即有可能是傳入一個也可能是傳入4個,我們對傳入正確的值進(jìn)行判定椒舵,并調(diào)用數(shù)據(jù)庫orm創(chuàng)建該字段的對象蚂踊,然后拋到列表中,醬汁我們就獲取到了所有正確的參數(shù)的orm對象笔宿。
那么問題來了犁钟,我們?nèi)绾伟堰@個列表中的所有參數(shù)按照orm要求的where條件傳入呢?
也就是這段
正常的查詢請求應(yīng)該是醬汁的
select_ip = session.query(reload_system_log).filter(
reload_system_log.ip == kwargs['ip'],
reload_system_log.odd_numbers == kwargs['odd_numbers'],
).all()
但是由于我們要對傳入值做判定泼橘,所以要把列表中的對象轉(zhuǎn)換成 對象1,對象2,這樣的字段傳入到orm查詢請求中涝动。
想過將列表中的對象通過for出來,然后格式化到一個變量上炬灭,毫無疑問失敗了
一個變量僅可以綁定一個對象醋粟,或字符串,數(shù)字啥的,但是我們這個是多個對象昔穴,行不通的镰官,大伙可以試試
最終問大神后說你單獨(dú)寫個函數(shù),然后用*args直接解析傳入的列表就可以把列表中的內(nèi)容拆分成 對象1,對象2,這樣的了吗货,試了一把 果然ok
對于args的使用泳唠,可以看下這篇文章,例子很簡單宙搬,理解很容易
http://python.jobbole.com/83476/