Flask-SQLAlchemy导入CSV时将"True"/"False"转布尔值且保留其他字符串的方法
解决方案
你只需要加一个轻量的类型转换函数,仅对匹配到的"True"/"False"字符串做布尔转换,其余值原样返回即可,完全不需要绑定列名,也不会破坏原有代码逻辑。
第一步:定义转换函数
def convert_bool(value: str): # 严格匹配csv.DictWriter输出的布尔字符串格式 if value == "True": return True elif value == "False": return False # 其余所有类型/值直接返回不处理 return value
如果需要兼容大小写、前后带空格的异常输入,可以用增强版函数:
def convert_bool(value: str): if not isinstance(value, str): return value cleaned = value.strip().lower() if cleaned == "true": return True elif cleaned == "false": return False return value
第二步:修改原有赋值逻辑
仅需要在setattr时给值过一遍转换函数即可,其余代码完全不用改:
reader = csv.DictReader(fh) ... for row in reader: ... contact = Contact.query.get(row['id']) for key, value in row.items(): setattr(contact, key, convert_bool(value))
方案优势
- 完全不依赖表结构、字段名,后续修改模型字段不需要调整转换逻辑
- 没有额外依赖,不会像
ast.literal_eval一样遇到非布尔字符串抛出异常 - 性能开销极低,仅做2次字符串判断就可以完成转换
内容的提问来源于stack exchange,提问作者Darwin von Corax
相关产品推荐
相关产品推荐

