You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+SQL:字符列前导零无法持久化问题求助

问题原因分析
  • 动态SQL拼接引发类型解析错误:你当前用f-string把pFinal直接拼进UPDATE语句,比如传入的pFinal是'01234',最终生成的SQL是:
    UPDATE <SQL TABLE> SET [Last Used Number] = 01234
    
    SQL Server会把01234识别为整数(整数不允许前导零),自动去掉前导零后再转成字符串存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:54:52