已解决Python向数据库插入数据的字符串中含有单引号或双引号报错:(102, b"Incorrect syntax near ‘S’.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")


文章目录

  • 报错代码
  • 报错原因
  • 解决方法1
  • 解决方法2
  • 解决方法3
  • 解决方法4(推荐)
  • 帮忙解决

报错代码

最近处理部分数据,某些字段的数据中,含有一个单引号入库是会报错,报错代码如下:

sql = "insert into TM_DATA (a,b,c) VALUES ('%s','%s','%s')" % data 

打印拼接好的报错SQL如下:

insert into TM_DATA (a,b,c) VALUES ('22609132','3','MEMORIES OF BEGINNER'S MIND') 

检查语句时发现,文件中数据有个’单引号:

已解决Python向数据库插入数据的字符串中含有单引号或双引号报错

尝试手动把单引号换成双引号后,在数据库运行依旧报错:

已解决Python向数据库插入数据的字符串中含有单引号或双引号报错

报错原因

报错原因

对于这个问题,错误原因就是因为单引号是作为数据库字符串的标识的,因此,当字符串中有单引号号时,通过python入库时,原本的一个字符串会分割为多个字符串。因此就是要想办法将这些分割的字符串重新拼接起来。

解决方法1

将单引号替换为空,如下代码中示例,变量a存储的信息,将其替换后就可以按照常规的入库操作即可。

a = a.replace("'","") # 进行替换 

解决方法2

在对这个sql的写法进行一个改变,在python中可以使用三对双引号来表示字符串,然后sql语法中的引号使用双引号,插入字符串中的引号使用单引号就不会出现破坏sql语法的问题。:

sql = """insert into TM_DATA (a,b,c) VALUES ("%s","%s","%s")""" % data 

解决方法3

pymysql中有专门的转义方法,使用时只需要先将特定的字符串进行转义,然后再将转义后的字符串插入到数据库中即可,代码示例如下:

# v1.0.0及以上 from pymysql.converters import escape_string  # v0.10.1及以下 from pymysql import escape_string  # data为含有单引号或者双引号的字符串 data = escape_string(data) 

解决方法4(推荐)

用pandas入库,不用写SQL语句就可以直接存:

engine = sqlalchemy.create_engine('mssql+pymssql://账号:密码@服务器地址:端口号/库名') if len(df) - 1 < 2000:     df.to_sql("表名", con=engine, if_exists="append", index=False, chunksize=10000) else:     start = 0     for i in range(0, len(df), 2000):         end = i         dfn = df.loc[start:end]         # print(dfn)         dfn.to_sql("表名", con=engine, if_exists="append", index=False, chunksize=10000)         # print("入库2000行...")         start = end + 1      dfn = df.loc[start:len(df) - 1]     dfn.to_sql("表名", con=engine, if_exists="append", index=False, chunksize=10000) 

帮忙解决

本文已收录于:《告别Bug》专栏

本专栏用于记录学习和工作中遇到的各种疑难Bug问题,以及粉丝群里小伙伴提出的各种问题,文章形式:报错代码 + 报错翻译 + 报错原因 + 解决方法,包括程序安装、运行程序过程中等等问题,订阅专栏+关注博主后如遇到其他问题可私聊帮忙解决!!!