国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作

瀏覽:5日期:2022-07-22 15:54:06

本文由Markdown語(yǔ)法編輯器編輯完成。

1. 需求:

現(xiàn)在有一個(gè)Python的需求需要實(shí)現(xiàn):

就是實(shí)現(xiàn)連接一次數(shù)據(jù)庫(kù),就能夠執(zhí)行多條SQL語(yǔ)句,而且這個(gè)SQL語(yǔ)句是需要通過(guò)調(diào)用者將每一次執(zhí)行的參數(shù)傳入進(jìn)來(lái),組合成一條完整的SQL語(yǔ)句再去執(zhí)行。

經(jīng)過(guò)初步研究,傳入?yún)?shù)時(shí),通過(guò)數(shù)組的形式,數(shù)組中的每一個(gè)元素則是一個(gè)元組tuple(因?yàn)镾QL中需要填入的參數(shù)可能是多個(gè),所以需要通過(guò)元組的形式傳入)。

比如SQL語(yǔ)句的形式為:

basic_sql = ‘SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”’

在這條SQL中,有兩個(gè)變量需要傳入,分別用{}表示,一個(gè)是序列的body_part, 一個(gè)是序列的modality。準(zhǔn)備傳入的參數(shù)為:

[(‘Chest’, ‘CT’), (‘Lung’, ‘MRI’), (‘Leg’, ‘DR’)]等。

希望通過(guò)以下的格式化函數(shù),將參數(shù)傳入:

SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”.format(param1, param2) 這樣。

2. 函數(shù)實(shí)現(xiàn):

雖然看起來(lái)這個(gè)需求非常明確,也比較簡(jiǎn)單。但是實(shí)現(xiàn)起來(lái),還是花費(fèi)了我好長(zhǎng)的時(shí)間。究其原因,主要的困惑就是如何能夠?qū)⑦@個(gè)參數(shù)傳入到SQL中,并且去執(zhí)行SQL。

2.1 思路一:

在基于需求中提到的那個(gè)解決思路,我希望是拼接字符串,將拼接后的整個(gè)字符串作為完整的SQL語(yǔ)句,然后執(zhí)行生成結(jié)果。

def execute_multi_sql(self, sql, params_list): result_list = [] try: self._db_connection = self._db_connection_pool.connection() self._db_cursor = self._db_connection.cursor() for params in params_list: combined_sql = [] combined_sql.append(sql) combined_sql.append(’.format(’) combined_sql.append(’,’.join(map(str, params))) combined_sql.append(’)’) combined_sql = ’’.join(combined_sql) logger.debug('executing sql: %s' % combined_sql) self._db_cursor.execute(combined_sql) result = self._db_cursor.fetchall() logger.debug(u'SQL語(yǔ)句已經(jīng)被執(zhí)行, 結(jié)果是:n %s' % str(result)) result_list.append(result) except Exception as e: logger.exception(u'執(zhí)行sql語(yǔ)句時(shí),發(fā)生了錯(cuò)誤: %s', e.message) raise finally: self._db_connection.close() return result_list

但是在執(zhí)行這個(gè)函數(shù)的時(shí)候,會(huì)報(bào)異常,異常說(shuō)明是:tuple out of bounds.

以下是問(wèn)題產(chǎn)生的原因:

2.2 思路二:

通過(guò)google搜索,最終找到的解決方案是如下鏈接所示:

expanding tuples into arguments.

https://stackoverflow.com/questions/1993727/expanding-tuples-into-arguments

from DBUtils.PooledDB import PooledDBimport logging...... def execute_multi(self, sql, params_list): if not isinstance(params_list, list): raise Exception(u’傳入?yún)?shù)要求是列表類型,請(qǐng)檢查傳入?yún)?shù)類型!’) result_list = [] try: self._db_connection = self._db_connection_pool.connection() self._db_cursor = self._db_connection.cursor() for params in params_list: # 將每一個(gè)元組中存的參數(shù)傳入format中,替換sql中的變量值. # 如果數(shù)組中的元素不是元組,則sql中只有一個(gè)變量需要替換,將參數(shù)直接替換. if isinstance(params, tuple): combined_sql = sql.format(*params) else: combined_sql = sql.format(params) logger.debug('executing sql: %s' % combined_sql) self._db_cursor.execute(combined_sql) result = self._db_cursor.fetchall() logger.debug(u'SQL語(yǔ)句已經(jīng)被執(zhí)行, 結(jié)果是:n %s' % str(result)) if len(result) > 0: result_list.append(result) except Exception as e: logger.exception(u'執(zhí)行sql語(yǔ)句時(shí),發(fā)生了錯(cuò)誤: %s', e.message) raise finally: self._db_connection.close() return result_list

這段代碼中,最主要的修改就是關(guān)于處理參數(shù)的部分. 由于傳入的參數(shù)是一個(gè)數(shù)組,數(shù)組中的每一個(gè)元素是一個(gè)tuple, tuple內(nèi)的元素個(gè)數(shù)是由第2個(gè)參數(shù)sql中需要傳入的參數(shù)個(gè)數(shù)對(duì)應(yīng)的。

如上述需求中提到的,傳入的sql中需要補(bǔ)充兩個(gè)參數(shù)值,分別是body_part和modality, 因此數(shù)組中每一個(gè)tuple的長(zhǎng)度也是2.

這樣通過(guò)*tuple的方式,可以依次取出tuple中的每一個(gè)元素作為變量,傳入前面的sql語(yǔ)句中,組成一個(gè)完整的sql語(yǔ)句。

然后再調(diào)用db.execute, 便可以獲取到查詢結(jié)果.

補(bǔ)充知識(shí):Python——利用元組作為函數(shù)返回值:輸出最值和個(gè)數(shù)

廢話不多說(shuō),看代碼!

# 利用元組作為函數(shù)返回值:輸出最值和個(gè)數(shù)def yuanzu(*xxx): i = max(xxx) j = min(xxx) print('最大值是%s' % i) print('最小值是%s' % j) l = len(xxx) print('長(zhǎng)度是{0}'.format(l))yuanzu(1,2,5,6,5)

以上這篇Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 成人午夜久久精品 | 欧美日韩一区二区在线观看 | 波多野一区二区 | 手机看片神马午夜 | 国产一级片网址 | 欧美专区视频 | 久久九九有精品国产56 | 午夜欧美精品久久久久久久久 | 欧美一区2区 | 国产高清在线 | 色九九| 毛片免费网址 | 亚洲图片在线视频 | 国厂自拍 | 美女扒开腿让男人桶尿口 | 国产一区二区三区在线看 | 免费观看欧美精品成人毛片 | 免费观看呢日本天堂视频 | 特黄a大片免费视频 | 欧美日韩国产亚洲一区二区 | 日本不卡在线一区二区三区视频 | 欧美精品hdvdeosex4k | 视频一区在线免费观看 | 成人毛片免费观看视频在线 | 久久在线精品 | 免费看一区二区三区 | 欧美精品人爱a欧美精品 | 香蕉久久一区二区不卡无毒影院 | 另类视频一区 | 国产精品久久久久一区二区 | 国产精品亚洲第五区在线 | 久久九九热视频 | 一级网站片 | a网在线| 日韩在线视频免费不卡一区 | 久久综合久久美利坚合众国 | 国产成人精品男人免费 | 国产午夜伦伦伦午夜伦 | 91久久亚洲精品一区二区 | 日日碰碰 | 欧美高清视频在线观看 |