SQL中联表的运用
当出现要大量数据去查询时,不要一个个去SQL查询,应该要批量的去查询。
def batch_cavity_query(self, fuseids):
“”“批量查询cavity信息”“”
if not fuseids:
return {}
# 创建临时表批量查询
try:# 创建临时表self.cursor.execute("CREATE TABLE #TempFuseIDs (fuseid VARCHAR(100))")# 批量插入数据self.cursor.executemany("INSERT INTO #TempFuseIDs VALUES (%s)", [(fid,) for fid in fuseids])query = """SELECT DA.qrc_fuseid,C.Barcode AS QRcode,L.qrc_fuseid AS LensData_FuseID,C.CavityFROM #TempFuseIDs tempLEFT JOIN A DAON temp.fuseid = DA.qrc_fuseidLEFT JOIN B LON DA.qrc_QRcode = L.qrc_QRcodeLEFT JOIN C CON L.qrc_fuseid = C.Barcode"""self.cursor.execute(query)results = self.cursor.fetchall()# 构建映射字典cavity_map = {}for row in results:fuseid = row[0]cavity_map[fuseid] = (row[1], row[2], row[3])return cavity_map
finally:self.cursor.execute("DROP TABLE #TempFuseIDs")
def batch_query_sn(self, fuseids):"""批量查询SN相关信息"""if not fuseids:return {}
try:# 创建临时表self.cursor.execute("CREATE TABLE #TempFuseIDs (fuseid VARCHAR(100))")self.cursor.executemany("INSERT INTO #TempFuseIDs VALUES (%s)", [(fid,) for fid in fuseids])query = """SELECT temp.fuseid,eqp_name,station_code,TRY_CAST(testres_main_test_recordposition3_ut_z AS FLOAT) - TRY_CAST(testres_main_test_recordposition2_ut_z AS FLOAT) AS offset,timeFROM #TempFuseIDs tempLEFT JOIN D AAON AA.sensor_id = temp.fuseid"""self.cursor.execute(query)results = self.cursor.fetchall()sn_map = {}for row in results:fuseid = row[0]sn_map[fuseid] = (row[1], row[2], float(row[3]) if row[3] else 0, row[4])return sn_map
finally:self.cursor.execute("DROP TABLE #TempFuseIDs")