Python中cursor.execute使用SUBSTR截取值失效及查询验证咨询
验证SQL截取时区逻辑的实用方法
首先得说,你当前Python代码里的参数写法有个隐患:SUBSTR('%s',24,6)是直接把row[1]拼进SQL字符串,不是真正的参数化绑定,这容易触发SQL语法错误(比如字符串里有单引号),还存在SQL注入风险。不过先回到你的核心需求——验证截取逻辑是否正确,给你几个靠谱的方法:
1. 先离线测试截取逻辑
把row[1]的实际值(比如'2016-01-12T14:29:31.000+02:00')单独拿出来,在Python里先测试截取效果,或者直接在MySQL客户端跑截取语句:
- Python里测试:
test_dt = '2016-01-12T14:29:31.000+02:00' # 注意Python字符串索引从0开始,23到29的切片正好是+02:00 test_timezone = test_dt[23:29] print(test_timezone) # 应该输出+02:00 - MySQL客户端测试:
SELECT SUBSTR('2016-01-12T14:29:31.000+02:00',24,6);
确认这个截取逻辑没问题后,再结合插入流程验证。
2. 打印要执行的SQL语句(仅用于测试)
在Python里把拼接后的SQL打印出来,复制到MySQL客户端执行,看插入结果是否符合预期:
csv_data = csv.reader(open('aaaa.csv')) for row in csv_data: # 构造完整SQL(仅测试用,生产环境别这么写) sql = f"INSERT INTO time2(col1, EventTimeZone) VALUES('{row[0]}', SUBSTR('{row[1]}',24,6))" print(sql) # 可以先注释掉execute,先看SQL是否正确 # cursor.execute(sql)
把打印的SQL拿到MySQL里跑,然后查询time2表,看EventTimeZone字段是不是+02:00。
3. 插入后直接查询验证
不管用哪种写法,插入完成后立刻查询对应记录,验证存储的时区值:
csv_data = csv.reader(open('aaaa.csv')) for row in csv_data: cursor.execute('INSERT INTO time2(col1, EventTimeZone) VALUES(%s,SUBSTR(\'%s\',24,6))', (row[0],row[1])) # 插入后查询验证 cursor.execute("SELECT EventTimeZone FROM time2 WHERE col1 = %s", (row[0],)) stored_timezone = cursor.fetchone()[0] print(f"插入的col1值:{row[0]},存储的时区:{stored_timezone}") # 对比预期值 expected_timezone = row[1][23:29] if stored_timezone == expected_timezone: print("✅ 时区截取正确!") else: print(f"❌ 截取错误,预期:{expected_timezone},实际:{stored_timezone}")
更推荐的写法:Python先处理再传入
其实没必要在SQL里做截取,直接在Python里处理好时区值,再参数化传入SQL,既安全又容易验证:
csv_data = csv.reader(open('aaaa.csv')) for row in csv_data: # Python中完成截取 event_timezone = row[1][23:29] # 提前验证截取结果 print(f"处理后的时区:{event_timezone}") # 参数化插入,避免SQL注入 cursor.execute('INSERT INTO time2(col1, EventTimeZone) VALUES(%s, %s)', (row[0], event_timezone))
这种方式你能直接看到处理后的时区值,插入后再查询验证也更简单。
内容的提问来源于stack exchange,提问作者luckyday
相关产品推荐
相关产品推荐

