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


    已解决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")











    报错代码



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

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

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

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

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


    在这里插入图片描述

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


    在这里插入图片描述

    报错原因


    报错原因

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



    解决方法1


    将单引号替换为空,如下代码中示例,变量a存储的信息,将其替换后就可以按照常规的入库操作即可。
    a = a.replace("'","") # 进行替换
    
    • 1


    解决方法2



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

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


    解决方法3


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

    # v1.0.0及以上
    from pymysql.converters import escape_string
    
    # v0.10.1及以下
    from pymysql import escape_string
    
    # data为含有单引号或者双引号的字符串
    data = escape_string(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8


    解决方法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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    以上是此问题报错原因的解决方法,欢迎评论区留言讨论是否能解决,如果有用欢迎点赞收藏文章谢谢支持,博主才有动力持续记录遇到的问题!!!

    千人全栈VIP答疑群联系博主帮忙解决报错

    由于博主时间精力有限,每天私信人数太多,没办法每个粉丝都及时回复,所以优先回复VIP粉丝,可以通过订阅限时9.9付费专栏《100天精通Python从入门到就业》进入千人全栈VIP答疑群,获得优先解答机会(代码指导、远程服务),白嫖80G学习资料大礼包,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

    • 优点作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会),此专栏文章是专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试!

    • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等

    • 注意:如果希望得到及时回复,订阅专栏后私信博主进千人VIP答疑群在这里插入图片描述
      在这里插入图片描述

    免费资料获取,更多粉丝福利,关注下方公众号获取

    在这里插入图片描述

  • 相关阅读:
    oracle数据库的字段实现递增
    Shell条件测试练习
    MySQL 并发事务问题和隔离级别 (事务篇 三)
    Slope
    python+pygame+opencv+gpt实现虚拟数字人直播(一)
    Arduino ESP8266/32 自定义IO组网页状态显示与控制
    C陷阱和缺陷 第3章 语义“陷阱” 3.2 非数组的指针
    Java基于SpringBoot的数码论坛系统
    java基于SpringBoot+Vue的大学生体质健康测试管理系统 element
    数据插值——对不同量级的数据进行归一化
  • 原文地址:https://blog.csdn.net/yuan2019035055/article/details/127277117