Python+SQL:字符列前导零无法持久化问题求助
问题原因分析
- 动态SQL拼接引发类型解析错误:你当前用f-string把
pFinal直接拼进UPDATE语句,比如传入的pFinal是'01234',最终生成的SQL是:
SQL Server会把UPDATE <SQL TABLE> SET [Last Used Number] = 0123401234识别为整数(整数不允许前导零),自动去掉前导零后再转成字符串存入nchar(5)字段,直接导致前导零丢失。 - 未使用参数化查询:直接拼接字符串不仅有SQL注入风险,还会让SQL Server自动解析传入值的类型,完全忽略你原本的字符串格式要求。
修复方案
1. 修复SQL写入函数(核心解决前导零丢失)
将字符串拼接改为参数化查询,让SQL Server明确识别传入值为字符串类型:
def sqlConnectWrite(pFinal): try: conn = pyodbc.connect('Driver={SQL Server};' 'Server=<server>;' 'Database=<database>;' r'UID=<user>;' 'PWD=<pass>;' 'Trusted_Connection=yes;') cursor = conn.cursor() print("SQL Connection Successful!") print("Running Query....") print('SQL WRITE OPERATION INITIATED') print(pFinal) # 使用参数化查询,?是pyodbc的参数占位符 cursor.execute('UPDATE <SQL TABLE> SET [Last Used Number] = ?', (pFinal,)) conn.commit() except pyodbc.Error: logging.exception('SQL: Exception thrown in write process') finally: # 避免conn未创建成功时调用close报错 if 'conn' in locals() and conn: conn.close() print('SQL Operations Completed')
2. 简化密钥生成逻辑(可选,减少冗余代码)
无需自定义leadingZero函数,Python自带的字符串格式化可直接生成5位带前导零的字符串:
def assign(fList, p): for i in fList: p += 1 # 直接格式化为5位字符串,不足补前导零 key_str = f"{p:05d}" oldName = fr"{fileDirPath}\{i}" newName = fr"{fileDirPath}<prefix value>{key_str}<suffix value>" print(newName) # 直接传入格式化后的字符串 sqlConnectWrite(f"{p:05d}") # 可移除冗余的leadingZero函数
修改后,参数化查询会把带前导零的字符串直接传递给SQL Server,nchar(5)字段就能正确保留前导零格式。
内容的提问来源于stack exchange,提问作者ankill
相关产品推荐
相关产品推荐

