Python中含Null条件的if-else语句不生效问题排查
问题排查与解决
给定数据
2022-09-02 12:25:28.390508,--1, table_name column_name business_key_name select_column_names 0 DimCurrency FirstName where_condition schema_name schema_table 0 testdb testdb.DimCurrency
问题代码
try: if src_input['column_name'] is not None and src_input['where_condition'].isnull(): #print("test", src_input['where_condition'].isnull()) sql = 'select ' + src_input["column_name"] + ' as src_clmn from ' + \ src_input['schema_table'] sql = sql[0] df1 = pd.read_sql_query(sql, db_conn) loging(datetime.datetime.now(), 'df1', df1) return df1 elif pd.notnull(src_input['column_name']) and pd.notnull(src_input['where_condition']): sql = 'select ' + src_input["column_name"] + ' as src_clmn from ' + \ src_input['schema_table'] +' where ' + src_input['where_condition'] sql = sql[0] print(sql)
问题原因
- 对象判断逻辑错误:
src_input['column_name'] is not None判断的是整个Series对象是否为None,而非列内的实际值是否非空——哪怕列里有有效值,这个判断永远为True,因为Series本身是一个非None的对象。 - 布尔Series直接用于条件判断:
src_input['where_condition'].isnull()返回的是布尔类型的Series(如0 True),直接放在if条件中会触发pandas的布尔值判断异常,导致逻辑分支无法按预期触发。 - SQL拼接隐患:直接用Series拼接SQL会把Series的完整字符串表示(如
0 FirstName)带入SQL,导致语法错误。
解决方案
针对单行DataFrame,先提取对应行的单个元素再做判断和操作:
try: # 提取第一行的实际值 col_name = src_input['column_name'].iloc[0] where_cond = src_input['where_condition'].iloc[0] schema_table = src_input['schema_table'].iloc[0] if pd.notnull(col_name) and pd.isnull(where_cond): sql = f'select {col_name} as src_clmn from {schema_table}' df1 = pd.read_sql_query(sql, db_conn) loging(datetime.datetime.now(), 'df1', df1) return df1 elif pd.notnull(col_name) and pd.notnull(where_cond): sql = f'select {col_name} as src_clmn from {schema_table} where {where_cond}' print(sql)
关键修改点:
- 用
.iloc[0]提取DataFrame第一行的单个值,避免操作整个Series - 改用f-string拼接SQL,更简洁且避免Series字符串污染SQL语句
- 统一使用
pd.notnull()/pd.isnull()判断单个值的空值状态,逻辑更清晰
内容的提问来源于stack exchange,提问作者Alia
相关产品推荐
相关产品推荐

